You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

80 lines
3.8 KiB

#include <jni.h>
#include "com_iflytop_a800_utils_ScanResultAnalysisAlgo.h"
#include "opt_algo.hpp"
using namespace opt_algo;
/*
* Class: com_dreamworks_boditech_utils_MyOptAlgo
* Method: calculate
* Signature: ([FI)V
*/
JNIEXPORT jobject JNICALL Java_com_iflytop_a800_utils_ScanResultAnalysisAlgo_calculate(JNIEnv* env, jobject, jfloatArray data, jint peakNum) {
jsize dataLen = env->GetArrayLength(data);
jfloat * dataElements = env->GetFloatArrayElements(data, nullptr);
vector<float> originVal;
originVal.reserve(dataLen);
for (int i = 0; i < dataLen; ++i) {
originVal.push_back(dataElements[i]);
}
env->ReleaseFloatArrayElements(data, dataElements, JNI_ABORT);
shared_ptr<AlgoResult> algoResult;
algoResult = OptAlgo::calculate(originVal, peakNum);
if (nullptr == algoResult) {
return nullptr;
}
// setup result
jclass resultClass = env->FindClass("com/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoResult");
jmethodID resultConstructor = env->GetMethodID(resultClass, "<init>", "()V");
jobject resultObject = env->NewObject(resultClass, resultConstructor);
// peak num
jfieldID resultPeakNumFieldID = env->GetFieldID(resultClass, "peakNum", "I");
env->SetIntField(resultObject, resultPeakNumFieldID, algoResult->peakNum);
// lineAvg250
jfloatArray lineAvg250 = env->NewFloatArray(250);
jfloat lineAvg250Values[250];
for (int i = 0; i < 250; ++i) {
lineAvg250Values[i] = algoResult->lineContext->avg250[i];
}
env->SetFloatArrayRegion(lineAvg250, 0, 250, lineAvg250Values);
jfieldID lineAvg250FieldID = env->GetFieldID(resultClass, "lineAvg250", "[F");
env->SetObjectField(resultObject, lineAvg250FieldID, lineAvg250);
// PeakInfos
jint maxPeakInfoCount = 5;
jclass resultPeakInfoClass = env->FindClass("com/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoResult$PeakInfo");
jobjectArray resultPeakInfoArray = env->NewObjectArray(maxPeakInfoCount, resultPeakInfoClass, nullptr);
for (int i = 0; i < maxPeakInfoCount; ++i) {
jmethodID resultPeakInfoConstructor = env->GetMethodID(resultPeakInfoClass, "<init>", "()V");
jobject resultPeakInfo = env->NewObject(resultPeakInfoClass, resultPeakInfoConstructor);
// findPeak
jfieldID findPeakFieldID = env->GetFieldID(resultPeakInfoClass, "findPeak", "Z");
env->SetBooleanField(resultPeakInfo, findPeakFieldID, algoResult->peakInfo[i]->find_peak ? JNI_TRUE : JNI_FALSE);
// peakFullArea
jfieldID peakFullAreaFieldID = env->GetFieldID(resultPeakInfoClass, "peakFullArea", "F");
env->SetFloatField(resultPeakInfo, peakFullAreaFieldID, algoResult->peakInfo[i]->peak_full_area);
// peakBaseLineArea
jfieldID peakBaseLineAreaFieldID = env->GetFieldID(resultPeakInfoClass, "peakBaseLineArea", "F");
env->SetFloatField(resultPeakInfo, peakBaseLineAreaFieldID, algoResult->peakInfo[i]->peak_base_line_area);
// area
jfieldID areaFieldID = env->GetFieldID(resultPeakInfoClass, "area", "F");
env->SetFloatField(resultPeakInfo, areaFieldID, algoResult->peakInfo[i]->area);
// peakPos
jfieldID peakPosFieldID = env->GetFieldID(resultPeakInfoClass, "peakPos", "I");
env->SetIntField(resultPeakInfo, peakPosFieldID, algoResult->peakInfo[i]->peak_pos);
// peakStartPos
jfieldID peakStartPosFieldID = env->GetFieldID(resultPeakInfoClass, "peakStartPos", "I");
env->SetIntField(resultPeakInfo, peakStartPosFieldID, algoResult->peakInfo[i]->peak_start_pos);
// peakEndPos
jfieldID peakEndPosFieldID = env->GetFieldID(resultPeakInfoClass, "peakEndPos", "I");
env->SetIntField(resultPeakInfo, peakEndPosFieldID, algoResult->peakInfo[i]->peak_end_pos);
env->SetObjectArrayElement(resultPeakInfoArray, i, resultPeakInfo);
}
jfieldID resultPeakInfoFieldID = env->GetFieldID(resultClass, "peakInfos", "[Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoResult$PeakInfo;");
env->SetObjectField(resultObject, resultPeakInfoFieldID, resultPeakInfoArray);
return resultObject;
}