#include #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 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 = 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, "", "()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, "", "()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; }