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.
 
 
 
 

182 lines
8.0 KiB

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