|
|
#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; }
|