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.

79 lines
3.8 KiB

1 year ago
  1. #include <jni.h>
  2. #include "com_iflytop_a800_utils_ScanResultAnalysisAlgo.h"
  3. #include "opt_algo.hpp"
  4. using namespace opt_algo;
  5. /*
  6. * Class: com_dreamworks_boditech_utils_MyOptAlgo
  7. * Method: calculate
  8. * Signature: ([FI)V
  9. */
  10. JNIEXPORT jobject JNICALL Java_com_iflytop_a800_utils_ScanResultAnalysisAlgo_calculate(JNIEnv* env, jobject, jfloatArray data, jint peakNum) {
  11. jsize dataLen = env->GetArrayLength(data);
  12. jfloat * dataElements = env->GetFloatArrayElements(data, nullptr);
  13. vector<float> originVal;
  14. originVal.reserve(dataLen);
  15. for (int i = 0; i < dataLen; ++i) {
  16. originVal.push_back(dataElements[i]);
  17. }
  18. env->ReleaseFloatArrayElements(data, dataElements, JNI_ABORT);
  19. shared_ptr<AlgoResult> algoResult;
  20. algoResult = OptAlgo::calculate(originVal, peakNum);
  21. if (nullptr == algoResult) {
  22. return nullptr;
  23. }
  24. // setup result
  25. jclass resultClass = env->FindClass("com/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoResult");
  26. jmethodID resultConstructor = env->GetMethodID(resultClass, "<init>", "()V");
  27. jobject resultObject = env->NewObject(resultClass, resultConstructor);
  28. // peak num
  29. jfieldID resultPeakNumFieldID = env->GetFieldID(resultClass, "peakNum", "I");
  30. env->SetIntField(resultObject, resultPeakNumFieldID, algoResult->peakNum);
  31. // lineAvg250
  32. jfloatArray lineAvg250 = env->NewFloatArray(250);
  33. jfloat lineAvg250Values[250];
  34. for (int i = 0; i < 250; ++i) {
  35. lineAvg250Values[i] = algoResult->lineContext->avg250[i];
  36. }
  37. env->SetFloatArrayRegion(lineAvg250, 0, 250, lineAvg250Values);
  38. jfieldID lineAvg250FieldID = env->GetFieldID(resultClass, "lineAvg250", "[F");
  39. env->SetObjectField(resultObject, lineAvg250FieldID, lineAvg250);
  40. // PeakInfos
  41. jint maxPeakInfoCount = 5;
  42. jclass resultPeakInfoClass = env->FindClass("com/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoResult$PeakInfo");
  43. jobjectArray resultPeakInfoArray = env->NewObjectArray(maxPeakInfoCount, resultPeakInfoClass, nullptr);
  44. for (int i = 0; i < maxPeakInfoCount; ++i) {
  45. jmethodID resultPeakInfoConstructor = env->GetMethodID(resultPeakInfoClass, "<init>", "()V");
  46. jobject resultPeakInfo = env->NewObject(resultPeakInfoClass, resultPeakInfoConstructor);
  47. // findPeak
  48. jfieldID findPeakFieldID = env->GetFieldID(resultPeakInfoClass, "findPeak", "Z");
  49. env->SetBooleanField(resultPeakInfo, findPeakFieldID, algoResult->peakInfo[i]->find_peak ? JNI_TRUE : JNI_FALSE);
  50. // peakFullArea
  51. jfieldID peakFullAreaFieldID = env->GetFieldID(resultPeakInfoClass, "peakFullArea", "F");
  52. env->SetFloatField(resultPeakInfo, peakFullAreaFieldID, algoResult->peakInfo[i]->peak_full_area);
  53. // peakBaseLineArea
  54. jfieldID peakBaseLineAreaFieldID = env->GetFieldID(resultPeakInfoClass, "peakBaseLineArea", "F");
  55. env->SetFloatField(resultPeakInfo, peakBaseLineAreaFieldID, algoResult->peakInfo[i]->peak_base_line_area);
  56. // area
  57. jfieldID areaFieldID = env->GetFieldID(resultPeakInfoClass, "area", "F");
  58. env->SetFloatField(resultPeakInfo, areaFieldID, algoResult->peakInfo[i]->area);
  59. // peakPos
  60. jfieldID peakPosFieldID = env->GetFieldID(resultPeakInfoClass, "peakPos", "I");
  61. env->SetIntField(resultPeakInfo, peakPosFieldID, algoResult->peakInfo[i]->peak_pos);
  62. // peakStartPos
  63. jfieldID peakStartPosFieldID = env->GetFieldID(resultPeakInfoClass, "peakStartPos", "I");
  64. env->SetIntField(resultPeakInfo, peakStartPosFieldID, algoResult->peakInfo[i]->peak_start_pos);
  65. // peakEndPos
  66. jfieldID peakEndPosFieldID = env->GetFieldID(resultPeakInfoClass, "peakEndPos", "I");
  67. env->SetIntField(resultPeakInfo, peakEndPosFieldID, algoResult->peakInfo[i]->peak_end_pos);
  68. env->SetObjectArrayElement(resultPeakInfoArray, i, resultPeakInfo);
  69. }
  70. jfieldID resultPeakInfoFieldID = env->GetFieldID(resultClass, "peakInfos", "[Lcom/iflytop/a800/utils/ScanResultAnalysisAlgo$AlgoResult$PeakInfo;");
  71. env->SetObjectField(resultObject, resultPeakInfoFieldID, resultPeakInfoArray);
  72. return resultObject;
  73. }