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