[Android] fix JNI OCRResult allocate errors (#588)

* [FlyCV] Add global SetProcLibCpuNumThreads method

* [Android] Support segmentation and facedet in Android

* [Android] add JNI instance check to j_runtime_option_obj

* [Model] fixed ppseg flycv resize error

* [FlyCV] fix FlyCV resize flags

* [cmake] remove un-need lite compile option

* [Android] add PaddleSegModel JNI and fix some bugs

* [Android] bind PaddleSegModel via JNI

* [Android] bind VisSegmentation via JNI

* [Android] bind YOLOv5Face and SCRFD via JNI

* [Android] fix NewJavaFaceDetectionResultFromCxx error

* [Android] remove un-need option in Java RuntimeOption

* [Android] fixed OcrMainActivity setting errors

* [Android] Update Android SDK usage docs

* [Android] Update Android SDK usage docs

* [Android] fix JNI OCRResult allocate errors
This commit is contained in:
DefTruth
2022-11-14 21:33:16 +08:00
committed by GitHub
parent dffcda513a
commit 8c79183ea4
2 changed files with 60 additions and 34 deletions

View File

@@ -209,9 +209,6 @@ public class DetectionMainActivity extends Activity implements View.OnClickListe
@Override
public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) {
Log.d(TAG, "onTextureChanged: bitmap height: "
+ ARGB8888ImageBitmap.getHeight() + " width: "
+ ARGB8888ImageBitmap.getWidth());
String savedImagePath = "";
synchronized (this) {
savedImagePath = Utils.getDCIMDirectory() + File.separator + "result.jpg";
@@ -224,10 +221,12 @@ public class DetectionMainActivity extends Activity implements View.OnClickListe
shutterBitmap = ARGB8888ImageBitmap;
originShutterBitmap = ARGB8888ImageBitmap;
}
boolean modified = false;
DetectionResult result = predictor.predict(
ARGB8888ImageBitmap, true, DetectionSettingsActivity.scoreThreshold);
modified = result.initialized();
if (!savedImagePath.isEmpty()) {
synchronized (this) {
DetectionMainActivity.this.savedImagePath = "result.jpg";

View File

@@ -30,6 +30,7 @@ bool AllocateJavaClassifyResultFromCxx(
// (1) mScores float[] shape (n): [F
// (2) mLabelIds int[] shape (n): [I
// (3) mInitialized boolean: Z
// Docs: docs/api/vision_results/classification_result.md
if (cxx_result == nullptr) {
return false;
}
@@ -85,6 +86,7 @@ bool AllocateJavaDetectionResultFromCxx(
// (2) mScores float[] shape (n): [F
// (3) mLabelIds int[] shape (n): [I
// (4) mInitialized boolean: Z
// Docs: docs/api/vision_results/detection_result.md
if (cxx_result == nullptr) {
return false;
}
@@ -138,7 +140,7 @@ bool AllocateJavaDetectionResultFromCxx(
env->SetObjectField(j_det_result_obj, j_det_label_ids_id, j_det_label_ids_int_arr);
env->SetBooleanField(j_det_result_obj, j_det_initialized_id, JNI_TRUE);
// Release non static local Refs
// Release local Refs
env->DeleteLocalRef(j_det_boxes_float_arr);
env->DeleteLocalRef(j_det_scores_float_arr);
env->DeleteLocalRef(j_det_label_ids_int_arr);
@@ -158,6 +160,7 @@ bool AllocateJavaOCRResultFromCxx(
// (4) mClsScores float[] shape (n): [F
// (5) mClsLabels int[] shape (n): [I
// (6) mInitialized boolean: Z
// Docs: docs/api/vision_results/ocr_result.md
if (cxx_result == nullptr) {
return false;
}
@@ -212,30 +215,35 @@ bool AllocateJavaOCRResultFromCxx(
jfloatArray j_ocr_rec_scores_float_arr = env->NewFloatArray(len);
env->SetFloatArrayRegion(j_ocr_rec_scores_float_arr, 0, len, rec_scores.data());
const int cls_len = static_cast<int>(c_result_ptr->cls_scores.size());
if (cls_len > 0) {
// mClsScores float[] shape (n): [F
const auto &cls_scores = c_result_ptr->cls_scores;
jfloatArray j_ocr_cls_scores_float_arr = env->NewFloatArray(len);
env->SetFloatArrayRegion(j_ocr_cls_scores_float_arr, 0, len, cls_scores.data());
jfloatArray j_ocr_cls_scores_float_arr = env->NewFloatArray(cls_len);
env->SetFloatArrayRegion(j_ocr_cls_scores_float_arr, 0, cls_len, cls_scores.data());
// mClsLabels int[] shape (n): [I
const auto &cls_labels = c_result_ptr->cls_labels;
jintArray j_ocr_cls_labels_int_arr = env->NewIntArray(len);
env->SetIntArrayRegion(j_ocr_cls_labels_int_arr, 0, len, cls_labels.data());
jintArray j_ocr_cls_labels_int_arr = env->NewIntArray(cls_len);
env->SetIntArrayRegion(j_ocr_cls_labels_int_arr, 0, cls_len, cls_labels.data());
env->SetObjectField(j_ocr_result_obj, j_ocr_cls_scores_id, j_ocr_cls_scores_float_arr);
env->SetObjectField(j_ocr_result_obj, j_ocr_cls_labels_id, j_ocr_cls_labels_int_arr);
env->DeleteLocalRef(j_ocr_cls_scores_float_arr);
env->DeleteLocalRef(j_ocr_cls_labels_int_arr);
}
// Set object fields
env->SetObjectField(j_ocr_result_obj, j_ocr_boxes_id, j_ocr_boxes_int_arr);
env->SetObjectField(j_ocr_result_obj, j_ocr_text_id, j_ocr_text_arr);
env->SetObjectField(j_ocr_result_obj, j_ocr_rec_scores_id, j_ocr_rec_scores_float_arr);
env->SetObjectField(j_ocr_result_obj, j_ocr_cls_scores_id, j_ocr_cls_scores_float_arr);
env->SetObjectField(j_ocr_result_obj, j_ocr_cls_labels_id, j_ocr_cls_labels_int_arr);
env->SetBooleanField(j_ocr_result_obj, j_ocr_initialized_id, JNI_TRUE);
// Release non static local Refs
// Release local Refs
env->DeleteLocalRef(j_ocr_boxes_int_arr);
env->DeleteLocalRef(j_ocr_text_arr);
env->DeleteLocalRef(j_ocr_rec_scores_float_arr);
env->DeleteLocalRef(j_ocr_cls_scores_float_arr);
env->DeleteLocalRef(j_ocr_cls_labels_int_arr);
env->DeleteLocalRef(j_ocr_result_clazz);
env->DeleteLocalRef(j_ocr_int_arr_clazz);
env->DeleteLocalRef(j_ocr_str_clazz);
@@ -253,6 +261,7 @@ bool AllocateJavaSegmentationResultFromCxx(
// (3) mContainScoreMap boolean: Z
// (4) mScoreMap float[] shape (n): [F
// (5) mInitialized boolean: Z
// Docs: docs/api/vision_results/segmentation_result.md
if (cxx_result == nullptr) {
return false;
}
@@ -314,7 +323,7 @@ bool AllocateJavaSegmentationResultFromCxx(
env->SetObjectField(j_seg_result_obj, j_seg_shape_id, j_seg_shape_long_arr);
env->SetBooleanField(j_seg_result_obj, j_seg_initialized_id, JNI_TRUE);
// Release non static local Refs
// Release local Refs
env->DeleteLocalRef(j_seg_label_map_int_arr);
env->DeleteLocalRef(j_seg_shape_long_arr);
env->DeleteLocalRef(j_seg_result_clazz);
@@ -332,6 +341,7 @@ bool AllocateJavaFaceDetectionResultFromCxx(
// (3) mLandmarks float[][] shape (n,2): [[F
// (4) mLandmarksPerFace int: I
// (5) mInitialized boolean: Z
// Docs: docs/api/vision_results/face_detection_result.md
if (cxx_result == nullptr) {
return false;
}
@@ -521,6 +531,7 @@ bool AllocateClassifyResultFromJava(
// (1) mScores float[] shape (n): [F
// (2) mLabelIds int[] shape (n): [I
// (3) mInitialized boolean: Z
// Docs: docs/api/vision_results/classification_result.md
if (cxx_result == nullptr || j_cls_result_obj == nullptr) {
return false;
}
@@ -573,6 +584,7 @@ bool AllocateClassifyResultFromJava(
std::memcpy(c_result_ptr->label_ids.data(), j_cls_label_ids_ptr, len * sizeof(int));
env->ReleaseIntArrayElements(j_cls_label_ids_int_arr, j_cls_label_ids_ptr, 0);
// Release local Refs
env->DeleteLocalRef(j_cls_result_clazz_cc);
return true;
@@ -587,6 +599,7 @@ bool AllocateDetectionResultFromJava(
// (2) mScores float[] shape (n): [F
// (3) mLabelIds int[] shape (n): [I
// (4) mInitialized boolean: Z
// Docs: docs/api/vision_results/detection_result.md
if (cxx_result == nullptr || j_det_result_obj == nullptr) {
return false;
}
@@ -662,6 +675,7 @@ bool AllocateDetectionResultFromJava(
std::memcpy(c_result_ptr->label_ids.data(), j_det_label_ids_ptr, len * sizeof(int));
env->ReleaseIntArrayElements(j_det_label_ids_int_arr, j_det_label_ids_ptr, 0);
// Release local Refs
env->DeleteLocalRef(j_det_result_clazz_cc);
return true;
@@ -677,6 +691,7 @@ bool AllocateOCRResultFromJava(
// (4) mClsScores float[] shape (n): [F
// (5) mClsLabels int[] shape (n): [I
// (6) mInitialized boolean: Z
// Docs: docs/api/vision_results/ocr_result.md
if (cxx_result == nullptr || j_ocr_result_obj == nullptr) {
return false;
}
@@ -721,9 +736,12 @@ bool AllocateOCRResultFromJava(
const int len = env->GetArrayLength(j_ocr_boxes_arr);
if ((len == 0) || (len != env->GetArrayLength(j_ocr_text_arr)) ||
(len != env->GetArrayLength(j_ocr_rec_scores_float_arr)) ||
(len != env->GetArrayLength(j_ocr_cls_scores_float_arr)) ||
(len != env->GetArrayLength(j_ocr_cls_labels_int_arr))) {
(len != env->GetArrayLength(j_ocr_rec_scores_float_arr))){
return false;
}
const int cls_len = env->GetArrayLength(j_ocr_cls_scores_float_arr);
if (cls_len != env->GetArrayLength(j_ocr_cls_labels_int_arr)) {
return false;
}
@@ -731,8 +749,11 @@ bool AllocateOCRResultFromJava(
c_result_ptr->Clear();
c_result_ptr->boxes.resize(len);
c_result_ptr->rec_scores.resize(len);
c_result_ptr->cls_scores.resize(len);
c_result_ptr->cls_labels.resize(len);
if (cls_len > 0) {
c_result_ptr->cls_scores.resize(cls_len);
c_result_ptr->cls_labels.resize(cls_len);
}
// mBoxes int[][] shape (n,8): [[I
bool c_check_validation = true;
@@ -765,18 +786,21 @@ bool AllocateOCRResultFromJava(
std::memcpy(c_result_ptr->rec_scores.data(), j_ocr_rec_scores_ptr, len * sizeof(float));
env->ReleaseFloatArrayElements(j_ocr_rec_scores_float_arr, j_ocr_rec_scores_ptr, 0);
if (cls_len > 0) {
// mClsScores float[] shape (n): [F
jfloat *j_ocr_cls_scores_ptr =
env->GetFloatArrayElements(j_ocr_cls_scores_float_arr, nullptr);
std::memcpy(c_result_ptr->rec_scores.data(), j_ocr_cls_scores_ptr, len * sizeof(float));
std::memcpy(c_result_ptr->cls_scores.data(), j_ocr_cls_scores_ptr, cls_len * sizeof(float));
env->ReleaseFloatArrayElements(j_ocr_cls_scores_float_arr, j_ocr_cls_scores_ptr, 0);
// mClsLabels int[] shape (n): [I
jint *j_ocr_cls_labels_ptr =
env->GetIntArrayElements(j_ocr_cls_labels_int_arr, nullptr);
std::memcpy(c_result_ptr->cls_labels.data(), j_ocr_cls_labels_ptr, len * sizeof(int));
std::memcpy(c_result_ptr->cls_labels.data(), j_ocr_cls_labels_ptr, cls_len * sizeof(int));
env->ReleaseIntArrayElements(j_ocr_cls_labels_int_arr, j_ocr_cls_labels_ptr,0);
}
// Release local Refs
env->DeleteLocalRef(j_ocr_result_clazz_cc);
return true;
@@ -791,6 +815,7 @@ bool AllocateSegmentationResultFromJava(
// (3) mContainScoreMap boolean: Z
// (4) mScoreMap float[] shape (n): [F
// (5) mInitialized boolean: Z
// Docs: docs/api/vision_results/segmentation_result.md
if (cxx_result == nullptr || j_seg_result_obj == nullptr) {
return false;
}
@@ -864,6 +889,7 @@ bool AllocateSegmentationResultFromJava(
env->ReleaseFloatArrayElements(j_seg_score_map_float_arr, j_seg_score_map_float_ptr, 0);
}
// Release local Refs
env->DeleteLocalRef(j_seg_result_clazz_cc);
return true;
@@ -878,6 +904,7 @@ bool AllocateFaceDetectionResultFromJava(
// (3) mLandmarks float[][] shape (n,2): [[F
// (4) mLandmarksPerFace int: I
// (5) mInitialized boolean: Z
// Docs: docs/api/vision_results/face_detection_result.md
if (cxx_result == nullptr || j_face_det_result_obj == nullptr) {
return false;
}
@@ -973,12 +1000,12 @@ bool AllocateFaceDetectionResultFromJava(
return false;
}
// Release local Refs
env->DeleteLocalRef(j_face_det_result_clazz_cc);
return true;
}
bool AllocateCxxResultFromJava(
JNIEnv *env, jobject j_result_obj, void *cxx_result,
vision::ResultType type) {