|
|
#include <jni.h>
#include "com_iflytop_a800_utils_ScanResultAnalysisAlgo.h"
#include "a8k_opt_algo.hpp"
using namespace a8k_opt_algo;
#define METHOD(name) Java_com_iflytop_a800_utils_ScanResultAnalysisAlgo_##name
/*
* Class: com_iflytop_a800_utils_ScanResultAnalysisAlgo * Method: tScanA8kOptAlgoPreProcess * Signature: ([FIII)Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo/OptAlgoPreProcessResult; */ JNIEXPORT jobject JNICALL METHOD(tScanA8kOptAlgoPreProcess)( JNIEnv* env, jobject, jfloatArray data, jint nowScanGain, jint expectResultRangeStart, jint expectResultRangeEnd ) { 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);
OptAlgoPreProcessResult oriResult; ecode_t rCode = T_A8kOptAlgoPreProcess(originVal, nowScanGain, expectResultRangeStart, expectResultRangeEnd, oriResult);
// setup result
jclass resultClass = env->FindClass("com/iflytop/a800/utils/ScanResultAnalysisAlgo$OptAlgoPreProcessResult"); jmethodID resultConstructor = env->GetMethodID(resultClass, "<init>", "()V"); jobject resultObject = env->NewObject(resultClass, resultConstructor);
// peak num
jfieldID resultCodeFieldID = env->GetFieldID(resultClass, "code", "I"); env->SetIntField(resultObject, resultCodeFieldID, rCode);
//scanAgain;
jfieldID resultScanAgainFieldID = env->GetFieldID(resultClass, "scanAgain", "Z"); env->SetBooleanField(resultObject, resultScanAgainFieldID, oriResult.scanAgain);
// suggestScanGain
jfieldID resultSuggestScanGainFieldID = env->GetFieldID(resultClass, "suggestScanGain", "I"); env->SetIntField(resultObject, resultSuggestScanGainFieldID, oriResult.suggestScanGain);
return resultObject; }
/*
* Class: com_iflytop_a800_utils_ScanResultAnalysisAlgo * Method: fScanA8kOptAlgoPreProcess * Signature: ([FIII)Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo/OptAlgoPreProcessResult; */ JNIEXPORT jobject JNICALL METHOD(fScanA8kOptAlgoPreProcess) ( JNIEnv* env, jobject, jfloatArray data, jint nowScanGain, jint expectResultRangeStart, jint expectResultRangeEnd ) { 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);
OptAlgoPreProcessResult oriResult; ecode_t rCode = F_A8kOptAlgoPreProcess(originVal, nowScanGain, expectResultRangeStart, expectResultRangeEnd, oriResult);
// setup result
jclass resultClass = env->FindClass("com/iflytop/a800/utils/ScanResultAnalysisAlgo$OptAlgoPreProcessResult"); jmethodID resultConstructor = env->GetMethodID(resultClass, "<init>", "()V"); jobject resultObject = env->NewObject(resultClass, resultConstructor);
// peak num
jfieldID resultCodeFieldID = env->GetFieldID(resultClass, "code", "I"); env->SetIntField(resultObject, resultCodeFieldID, rCode);
//scanAgain;
jfieldID resultScanAgainFieldID = env->GetFieldID(resultClass, "scanAgain", "Z"); env->SetBooleanField(resultObject, resultScanAgainFieldID, oriResult.scanAgain);
// suggestScanGain
jfieldID resultSuggestScanGainFieldID = env->GetFieldID(resultClass, "suggestScanGain", "I"); env->SetIntField(resultObject, resultSuggestScanGainFieldID, oriResult.suggestScanGain);
return resultObject; }
jobject buildPeakInfoToResultObject(JNIEnv* env, PeakInfo peakInfo) { jclass resultPeakInfoClass = env->FindClass("com/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult$PeakInfo"); 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, peakInfo.find_peak ? JNI_TRUE : JNI_FALSE); // area
jfieldID areaFieldID = env->GetFieldID(resultPeakInfoClass, "area", "F"); env->SetFloatField(resultPeakInfo, areaFieldID, peakInfo.area); // peakPos
jfieldID peakPosFieldID = env->GetFieldID(resultPeakInfoClass, "peakPos", "I"); env->SetIntField(resultPeakInfo, peakPosFieldID, peakInfo.peak_pos); // peakStartPos
jfieldID peakStartPosFieldID = env->GetFieldID(resultPeakInfoClass, "peakStartPos", "I"); env->SetIntField(resultPeakInfo, peakStartPosFieldID, peakInfo.peak_start_pos); // peakEndPos
jfieldID peakEndPosFieldID = env->GetFieldID(resultPeakInfoClass, "peakEndPos", "I"); env->SetIntField(resultPeakInfo, peakEndPosFieldID, peakInfo.peak_end_pos);
return resultPeakInfo; }
/*
* Class: com_iflytop_a800_utils_ScanResultAnalysisAlgo * Method: algoProcess * Signature: (F)Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo/AlgoProcessResult; */ JNIEXPORT jobject JNICALL METHOD(algoProcess) (JNIEnv* env, jobject, jfloatArray data) { 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);
OptAlgoResult algoResult; A8kOptAlgoProcess(originVal, algoResult);
// setup result
jclass resultClass = env->FindClass("com/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult"); jmethodID resultConstructor = env->GetMethodID(resultClass, "<init>", "()V"); jobject resultObject = env->NewObject(resultClass, resultConstructor);
// displayData
jfloatArray displayData = env->NewFloatArray(250); jfloat displayDataValues[250]; for (int i = 0; i < 250; ++i) { displayDataValues[i] = algoResult.displayData[i]; } env->SetFloatArrayRegion(displayData, 0, 250, displayDataValues); jfieldID displayDataFieldID = env->GetFieldID(resultClass, "displayData", "[F"); env->SetObjectField(resultObject, displayDataFieldID, displayData);
// input
jfloatArray inputData = env->NewFloatArray(1200); jfloat inputDataValues[1200]; for (int i = 0; i < 1200; ++i) { inputDataValues[i] = algoResult.input[i]; } env->SetFloatArrayRegion(inputData, 0, 1200, inputDataValues); jfieldID inputFieldID = env->GetFieldID(resultClass, "input", "[F"); env->SetObjectField(resultObject, inputFieldID, inputData);
// pin040
jfieldID resultPin040FieldID = env->GetFieldID(resultClass, "pin040", "Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult$PeakInfo;"); jobject resultPin040 = buildPeakInfoToResultObject(env, algoResult.pin040); env->SetObjectField(resultObject, resultPin040FieldID, resultPin040);
// pin080
jfieldID resultPin080FieldID = env->GetFieldID(resultClass, "pin080", "Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult$PeakInfo;"); jobject resultPin080 = buildPeakInfoToResultObject(env, algoResult.pin080); env->SetObjectField(resultObject, resultPin080FieldID, resultPin080);
// pin120
jfieldID resultPin120FieldID = env->GetFieldID(resultClass, "pin120", "Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult$PeakInfo;"); jobject resultPin120 = buildPeakInfoToResultObject(env, algoResult.pin120); env->SetObjectField(resultObject, resultPin120FieldID, resultPin120);
// pin160
jfieldID resultPin160FieldID = env->GetFieldID(resultClass, "pin160", "Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult$PeakInfo;"); jobject resultPin160 = buildPeakInfoToResultObject(env, algoResult.pin160); env->SetObjectField(resultObject, resultPin160FieldID, resultPin160);
// pin200
jfieldID resultPin200FieldID = env->GetFieldID(resultClass, "pin200", "Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult$PeakInfo;"); jobject resultPin200 = buildPeakInfoToResultObject(env, algoResult.pin200); env->SetObjectField(resultObject, resultPin200FieldID, resultPin200);
return resultObject; }
|