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.

181 lines
8.0 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. #include <jni.h>
  2. #include "com_iflytop_a800_utils_ScanResultAnalysisAlgo.h"
  3. #include "a8k_opt_algo.hpp"
  4. using namespace a8k_opt_algo;
  5. #define METHOD(name) Java_com_iflytop_a800_utils_ScanResultAnalysisAlgo_##name
  6. /*
  7. * Class: com_iflytop_a800_utils_ScanResultAnalysisAlgo
  8. * Method: tScanA8kOptAlgoPreProcess
  9. * Signature: ([FIII)Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo/OptAlgoPreProcessResult;
  10. */
  11. JNIEXPORT jobject JNICALL METHOD(tScanA8kOptAlgoPreProcess)(
  12. JNIEnv* env, jobject, jfloatArray data, jint nowScanGain, jint expectResultRangeStart, jint expectResultRangeEnd
  13. ) {
  14. jsize dataLen = env->GetArrayLength(data);
  15. jfloat* dataElements = env->GetFloatArrayElements(data, nullptr);
  16. vector<float> originVal;
  17. originVal.reserve(dataLen);
  18. for (int i = 0; i < dataLen; ++i) {
  19. originVal.push_back(dataElements[i]);
  20. }
  21. env->ReleaseFloatArrayElements(data, dataElements, JNI_ABORT);
  22. OptAlgoPreProcessResult oriResult;
  23. ecode_t rCode = T_A8kOptAlgoPreProcess(originVal, nowScanGain, expectResultRangeStart, expectResultRangeEnd, oriResult);
  24. // setup result
  25. jclass resultClass = env->FindClass("com/iflytop/a800/utils/ScanResultAnalysisAlgo$OptAlgoPreProcessResult");
  26. jmethodID resultConstructor = env->GetMethodID(resultClass, "<init>", "()V");
  27. jobject resultObject = env->NewObject(resultClass, resultConstructor);
  28. // peak num
  29. jfieldID resultCodeFieldID = env->GetFieldID(resultClass, "code", "I");
  30. env->SetIntField(resultObject, resultCodeFieldID, rCode);
  31. //scanAgain;
  32. jfieldID resultScanAgainFieldID = env->GetFieldID(resultClass, "scanAgain", "Z");
  33. env->SetBooleanField(resultObject, resultScanAgainFieldID, oriResult.scanAgain);
  34. // suggestScanGain
  35. jfieldID resultSuggestScanGainFieldID = env->GetFieldID(resultClass, "suggestScanGain", "I");
  36. env->SetIntField(resultObject, resultSuggestScanGainFieldID, oriResult.suggestScanGain);
  37. return resultObject;
  38. }
  39. /*
  40. * Class: com_iflytop_a800_utils_ScanResultAnalysisAlgo
  41. * Method: fScanA8kOptAlgoPreProcess
  42. * Signature: ([FIII)Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo/OptAlgoPreProcessResult;
  43. */
  44. JNIEXPORT jobject JNICALL METHOD(fScanA8kOptAlgoPreProcess) (
  45. JNIEnv* env, jobject, jfloatArray data, jint nowScanGain, jint expectResultRangeStart, jint expectResultRangeEnd
  46. ) {
  47. jsize dataLen = env->GetArrayLength(data);
  48. jfloat* dataElements = env->GetFloatArrayElements(data, nullptr);
  49. vector<float> originVal;
  50. originVal.reserve(dataLen);
  51. for (int i = 0; i < dataLen; ++i) {
  52. originVal.push_back(dataElements[i]);
  53. }
  54. env->ReleaseFloatArrayElements(data, dataElements, JNI_ABORT);
  55. OptAlgoPreProcessResult oriResult;
  56. ecode_t rCode = F_A8kOptAlgoPreProcess(originVal, nowScanGain, expectResultRangeStart, expectResultRangeEnd, oriResult);
  57. // setup result
  58. jclass resultClass = env->FindClass("com/iflytop/a800/utils/ScanResultAnalysisAlgo$OptAlgoPreProcessResult");
  59. jmethodID resultConstructor = env->GetMethodID(resultClass, "<init>", "()V");
  60. jobject resultObject = env->NewObject(resultClass, resultConstructor);
  61. // peak num
  62. jfieldID resultCodeFieldID = env->GetFieldID(resultClass, "code", "I");
  63. env->SetIntField(resultObject, resultCodeFieldID, rCode);
  64. //scanAgain;
  65. jfieldID resultScanAgainFieldID = env->GetFieldID(resultClass, "scanAgain", "Z");
  66. env->SetBooleanField(resultObject, resultScanAgainFieldID, oriResult.scanAgain);
  67. // suggestScanGain
  68. jfieldID resultSuggestScanGainFieldID = env->GetFieldID(resultClass, "suggestScanGain", "I");
  69. env->SetIntField(resultObject, resultSuggestScanGainFieldID, oriResult.suggestScanGain);
  70. return resultObject;
  71. }
  72. jobject buildPeakInfoToResultObject(JNIEnv* env, PeakInfo peakInfo) {
  73. jclass resultPeakInfoClass = env->FindClass("com/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult$PeakInfo");
  74. jmethodID resultPeakInfoConstructor = env->GetMethodID(resultPeakInfoClass, "<init>", "()V");
  75. jobject resultPeakInfo = env->NewObject(resultPeakInfoClass, resultPeakInfoConstructor);
  76. // findPeak
  77. jfieldID findPeakFieldID = env->GetFieldID(resultPeakInfoClass, "findPeak", "Z");
  78. env->SetBooleanField(resultPeakInfo, findPeakFieldID, peakInfo.find_peak ? JNI_TRUE : JNI_FALSE);
  79. // area
  80. jfieldID areaFieldID = env->GetFieldID(resultPeakInfoClass, "area", "F");
  81. env->SetFloatField(resultPeakInfo, areaFieldID, peakInfo.area);
  82. // peakPos
  83. jfieldID peakPosFieldID = env->GetFieldID(resultPeakInfoClass, "peakPos", "I");
  84. env->SetIntField(resultPeakInfo, peakPosFieldID, peakInfo.peak_pos);
  85. // peakStartPos
  86. jfieldID peakStartPosFieldID = env->GetFieldID(resultPeakInfoClass, "peakStartPos", "I");
  87. env->SetIntField(resultPeakInfo, peakStartPosFieldID, peakInfo.peak_start_pos);
  88. // peakEndPos
  89. jfieldID peakEndPosFieldID = env->GetFieldID(resultPeakInfoClass, "peakEndPos", "I");
  90. env->SetIntField(resultPeakInfo, peakEndPosFieldID, peakInfo.peak_end_pos);
  91. return resultPeakInfo;
  92. }
  93. /*
  94. * Class: com_iflytop_a800_utils_ScanResultAnalysisAlgo
  95. * Method: algoProcess
  96. * Signature: (F)Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo/AlgoProcessResult;
  97. */
  98. JNIEXPORT jobject JNICALL METHOD(algoProcess) (JNIEnv* env, jobject, jfloatArray data) {
  99. jsize dataLen = env->GetArrayLength(data);
  100. jfloat * dataElements = env->GetFloatArrayElements(data, nullptr);
  101. vector<float> originVal;
  102. originVal.reserve(dataLen);
  103. for (int i = 0; i < dataLen; ++i) {
  104. originVal.push_back(dataElements[i]);
  105. }
  106. env->ReleaseFloatArrayElements(data, dataElements, JNI_ABORT);
  107. OptAlgoResult algoResult;
  108. A8kOptAlgoProcess(originVal, algoResult);
  109. // setup result
  110. jclass resultClass = env->FindClass("com/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult");
  111. jmethodID resultConstructor = env->GetMethodID(resultClass, "<init>", "()V");
  112. jobject resultObject = env->NewObject(resultClass, resultConstructor);
  113. // displayData
  114. jfloatArray displayData = env->NewFloatArray(250);
  115. jfloat displayDataValues[250];
  116. for (int i = 0; i < 250; ++i) {
  117. displayDataValues[i] = algoResult.displayData[i];
  118. }
  119. env->SetFloatArrayRegion(displayData, 0, 250, displayDataValues);
  120. jfieldID displayDataFieldID = env->GetFieldID(resultClass, "displayData", "[F");
  121. env->SetObjectField(resultObject, displayDataFieldID, displayData);
  122. // input
  123. jfloatArray inputData = env->NewFloatArray(1200);
  124. jfloat inputDataValues[1200];
  125. for (int i = 0; i < 1200; ++i) {
  126. inputDataValues[i] = algoResult.input[i];
  127. }
  128. env->SetFloatArrayRegion(inputData, 0, 1200, inputDataValues);
  129. jfieldID inputFieldID = env->GetFieldID(resultClass, "input", "[F");
  130. env->SetObjectField(resultObject, inputFieldID, inputData);
  131. // pin040
  132. jfieldID resultPin040FieldID = env->GetFieldID(resultClass, "pin040", "Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult$PeakInfo;");
  133. jobject resultPin040 = buildPeakInfoToResultObject(env, algoResult.pin040);
  134. env->SetObjectField(resultObject, resultPin040FieldID, resultPin040);
  135. // pin080
  136. jfieldID resultPin080FieldID = env->GetFieldID(resultClass, "pin080", "Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult$PeakInfo;");
  137. jobject resultPin080 = buildPeakInfoToResultObject(env, algoResult.pin080);
  138. env->SetObjectField(resultObject, resultPin080FieldID, resultPin080);
  139. // pin120
  140. jfieldID resultPin120FieldID = env->GetFieldID(resultClass, "pin120", "Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult$PeakInfo;");
  141. jobject resultPin120 = buildPeakInfoToResultObject(env, algoResult.pin120);
  142. env->SetObjectField(resultObject, resultPin120FieldID, resultPin120);
  143. // pin160
  144. jfieldID resultPin160FieldID = env->GetFieldID(resultClass, "pin160", "Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult$PeakInfo;");
  145. jobject resultPin160 = buildPeakInfoToResultObject(env, algoResult.pin160);
  146. env->SetObjectField(resultObject, resultPin160FieldID, resultPin160);
  147. // pin200
  148. jfieldID resultPin200FieldID = env->GetFieldID(resultClass, "pin200", "Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoProcessResult$PeakInfo;");
  149. jobject resultPin200 = buildPeakInfoToResultObject(env, algoResult.pin200);
  150. env->SetObjectField(resultObject, resultPin200FieldID, resultPin200);
  151. return resultObject;
  152. }