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