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