#include #include #include #include #include #include #include #include "yolo_image.h" #include "rga/rga.h" #include "object_tracker/track_link.h" static char* jstringToChar(JNIEnv* env, jstring jstr) { char* rtn = NULL; jclass clsstring = env->FindClass("java/lang/String"); jstring strencode = env->NewStringUTF("utf-8"); jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode); jsize alen = env->GetArrayLength(barr); jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE); if (alen > 0) { rtn = new char[alen + 1]; memcpy(rtn, ba, alen); rtn[alen] = 0; } env->ReleaseByteArrayElements(barr, ba, 0); return rtn; } extern "C" JNIEXPORT jint JNICALL Java_com_rockchip_gpadc_demo_yolo_InferenceWrapper_navite_1init (JNIEnv *env, jobject obj, jint im_height, jint im_width, jint im_channel, jstring model_path) { char *model_path_p = jstringToChar(env, model_path); return create(im_height, im_width, im_channel, model_path_p); } extern "C" JNIEXPORT void JNICALL Java_com_rockchip_gpadc_demo_yolo_InferenceWrapper_native_1deinit (JNIEnv *env, jobject obj) { destroy(); } extern "C" JNIEXPORT jint JNICALL Java_com_rockchip_gpadc_demo_yolo_InferenceWrapper_native_1run (JNIEnv *env, jobject obj, jbyteArray in, jbyteArray grid0Out, jbyteArray grid1Out, jbyteArray grid2Out) { jboolean inputCopy = JNI_FALSE; jbyte* const inData = env->GetByteArrayElements(in, &inputCopy); jboolean outputCopy = JNI_FALSE; jbyte* const y0 = env->GetByteArrayElements(grid0Out, &outputCopy); jbyte* const y1 = env->GetByteArrayElements(grid1Out, &outputCopy); jbyte* const y2 = env->GetByteArrayElements(grid2Out, &outputCopy); run_yolo((char *)inData, (char *)y0, (char *)y1, (char *)y2); env->ReleaseByteArrayElements(in, inData, JNI_ABORT); env->ReleaseByteArrayElements(grid0Out, y0, 0); env->ReleaseByteArrayElements(grid1Out, y1, 0); env->ReleaseByteArrayElements(grid2Out, y2, 0); return 0; } extern "C" JNIEXPORT jint JNICALL Java_com_rockchip_gpadc_demo_yolo_InferenceWrapper_native_1post_1process(JNIEnv *env, jobject thiz, jbyteArray grid0_out, jbyteArray grid1_out, jbyteArray grid2_out, jintArray ids, jfloatArray scores, jfloatArray boxes) { jint detect_counts; jboolean inputCopy = JNI_FALSE; jbyte* const grid0_buf = env->GetByteArrayElements(grid0_out, &inputCopy); jbyte* const grid1_buf = env->GetByteArrayElements(grid1_out, &inputCopy); jbyte* const grid2_buf = env->GetByteArrayElements(grid2_out, &inputCopy); jboolean outputCopy = JNI_FALSE; jint* const y0 = env->GetIntArrayElements(ids, &outputCopy); jfloat* const y1 = env->GetFloatArrayElements(scores, &outputCopy); jfloat* const y2 = env->GetFloatArrayElements(boxes, &outputCopy); detect_counts = yolo_post_process((char *)grid0_buf, (char *)grid1_buf, (char *)grid2_buf, (int *)y0, (float *)y1, (float *)y2); env->ReleaseByteArrayElements(grid0_out, grid0_buf, JNI_ABORT); env->ReleaseByteArrayElements(grid1_out, grid1_buf, JNI_ABORT); env->ReleaseByteArrayElements(grid2_out, grid2_buf, JNI_ABORT); env->ReleaseIntArrayElements(ids, y0, 0); env->ReleaseFloatArrayElements(scores, y1, 0); env->ReleaseFloatArrayElements(boxes, y2, 0); return detect_counts; } extern "C" JNIEXPORT jint JNICALL Java_com_rockchip_gpadc_demo_rga_RGA_color_1convert(JNIEnv *env, jclass clazz, jbyteArray src, jint src_fmt, jbyteArray dst, jint dst_fmt, jint width, jint height, jint flip) { jboolean copy = JNI_FALSE; jbyte* src_buf = env->GetByteArrayElements(src, ©); jbyte* dst_buf = env->GetByteArrayElements(dst, ©); colorConvert(src_buf, src_fmt, dst_buf, dst_fmt, width, height, flip); env->ReleaseByteArrayElements(src, src_buf, 0); env->ReleaseByteArrayElements(dst, dst_buf, 0); return 0; } extern "C" JNIEXPORT jlong JNICALL Java_com_rockchip_gpadc_demo_tracker_ObjectTracker_native_1create (JNIEnv * env, jobject obj) { return create_tracker(); } extern "C" JNIEXPORT void JNICALL Java_com_rockchip_gpadc_demo_tracker_ObjectTracker_native_1destroy (JNIEnv * env, jobject obj, jlong handle) { destroy_tracker(handle); } extern "C" JNIEXPORT void JNICALL Java_com_rockchip_gpadc_demo_tracker_ObjectTracker_native_1track (JNIEnv * env, jobject obj, jlong handle, jint maxTrackLifetime, jint track_input_num, jfloatArray track_input_locations, jintArray track_input_class, jfloatArray track_input_score, jintArray track_output_num, jfloatArray track_output_locations, jintArray track_output_class, jfloatArray track_output_score, jintArray track_output_id, jint width, jint height) { jboolean inputCopy = JNI_FALSE; jfloat *const c_track_input_locations = env->GetFloatArrayElements(track_input_locations, &inputCopy); jint *const c_track_input_class = env->GetIntArrayElements(track_input_class, &inputCopy); jfloat *const c_track_input_score = env->GetFloatArrayElements(track_input_score, &inputCopy); jboolean outputCopy = JNI_FALSE; jint *const c_track_output_num = env->GetIntArrayElements(track_output_num, &outputCopy); jfloat *const c_track_output_locations = env->GetFloatArrayElements(track_output_locations, &outputCopy); jint *const c_track_output_class = env->GetIntArrayElements(track_output_class, &outputCopy); jfloat *const c_track_output_score = env->GetFloatArrayElements(track_output_score, &inputCopy); jint *const c_track_output_id = env->GetIntArrayElements(track_output_id, &outputCopy); track(handle, (int)maxTrackLifetime, (int) track_input_num, (float *) c_track_input_locations, (int *) c_track_input_class, (float *)c_track_input_score, (int *) c_track_output_num, (float *) c_track_output_locations, (int *) c_track_output_class, (float *)c_track_output_score, (int *) c_track_output_id, (int) width, (int)height); env->ReleaseFloatArrayElements(track_input_locations, c_track_input_locations, JNI_ABORT); env->ReleaseIntArrayElements(track_input_class, c_track_input_class, JNI_ABORT); env->ReleaseFloatArrayElements(track_input_score, c_track_input_score, JNI_ABORT); env->ReleaseIntArrayElements(track_output_num, c_track_output_num, 0); env->ReleaseFloatArrayElements(track_output_locations, c_track_output_locations, 0); env->ReleaseIntArrayElements(track_output_class, c_track_output_class, 0); env->ReleaseFloatArrayElements(track_output_score, c_track_output_score, 0); env->ReleaseIntArrayElements(track_output_id, c_track_output_id, 0); }