xref: /OK3568_Linux_fs/external/rknpu2/examples/rknn_yolov5_android_apk_demo/app/src/main/cpp/native-lib.cc (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 
2 #include <jni.h>
3 #include <unistd.h>
4 #include <errno.h>
5 #include <string.h>
6 #include <pthread.h>
7 #include <sys/syscall.h>
8 
9 #include <sched.h>
10 
11 #include "yolo_image.h"
12 #include "rga/rga.h"
13 #include "object_tracker/track_link.h"
14 
jstringToChar(JNIEnv * env,jstring jstr)15 static char* jstringToChar(JNIEnv* env, jstring jstr) {
16     char* rtn = NULL;
17     jclass clsstring = env->FindClass("java/lang/String");
18     jstring strencode = env->NewStringUTF("utf-8");
19     jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
20     jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);
21     jsize alen = env->GetArrayLength(barr);
22     jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
23 
24     if (alen > 0) {
25         rtn = new char[alen + 1];
26         memcpy(rtn, ba, alen);
27         rtn[alen] = 0;
28     }
29     env->ReleaseByteArrayElements(barr, ba, 0);
30     return rtn;
31 }
32 
33 extern "C"
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)34 JNIEXPORT jint JNICALL Java_com_rockchip_gpadc_demo_yolo_InferenceWrapper_navite_1init
35   (JNIEnv *env, jobject obj, jint im_height, jint im_width, jint im_channel,
36    jstring model_path)
37 {
38 	char *model_path_p = jstringToChar(env, model_path);
39 	return create(im_height, im_width, im_channel, model_path_p);
40 }
41 
42 extern "C"
Java_com_rockchip_gpadc_demo_yolo_InferenceWrapper_native_1deinit(JNIEnv * env,jobject obj)43 JNIEXPORT void JNICALL Java_com_rockchip_gpadc_demo_yolo_InferenceWrapper_native_1deinit
44 		(JNIEnv *env, jobject obj) {
45 	destroy();
46 
47 }
48 
49 extern "C"
Java_com_rockchip_gpadc_demo_yolo_InferenceWrapper_native_1run(JNIEnv * env,jobject obj,jbyteArray in,jbyteArray grid0Out,jbyteArray grid1Out,jbyteArray grid2Out)50 JNIEXPORT jint JNICALL Java_com_rockchip_gpadc_demo_yolo_InferenceWrapper_native_1run
51   (JNIEnv *env, jobject obj, jbyteArray in,
52    jbyteArray grid0Out, jbyteArray grid1Out, jbyteArray grid2Out) {
53 
54 
55   	jboolean inputCopy = JNI_FALSE;
56   	jbyte* const inData = env->GetByteArrayElements(in, &inputCopy);
57 
58  	jboolean outputCopy = JNI_FALSE;
59 
60   	jbyte* const y0 = env->GetByteArrayElements(grid0Out, &outputCopy);
61 	jbyte* const y1 = env->GetByteArrayElements(grid1Out, &outputCopy);
62 	jbyte* const y2 = env->GetByteArrayElements(grid2Out, &outputCopy);
63 
64 	run_yolo((char *)inData, (char *)y0, (char *)y1, (char *)y2);
65 
66 	env->ReleaseByteArrayElements(in, inData, JNI_ABORT);
67 	env->ReleaseByteArrayElements(grid0Out, y0, 0);
68 	env->ReleaseByteArrayElements(grid1Out, y1, 0);
69 	env->ReleaseByteArrayElements(grid2Out, y2, 0);
70 
71 	return 0;
72 }
73 
74 extern "C"
75 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)76 Java_com_rockchip_gpadc_demo_yolo_InferenceWrapper_native_1post_1process(JNIEnv *env, jobject thiz,
77 																		 jbyteArray grid0_out,
78 																		 jbyteArray grid1_out,
79 																		 jbyteArray grid2_out,
80 																		 jintArray ids,
81 																		 jfloatArray scores,
82 																		 jfloatArray boxes) {
83 	jint detect_counts;
84 	jboolean inputCopy = JNI_FALSE;
85 	jbyte* const grid0_buf = env->GetByteArrayElements(grid0_out, &inputCopy);
86 	jbyte* const grid1_buf = env->GetByteArrayElements(grid1_out, &inputCopy);
87 	jbyte* const grid2_buf = env->GetByteArrayElements(grid2_out, &inputCopy);
88 
89 	jboolean outputCopy = JNI_FALSE;
90 
91 	jint*   const y0 = env->GetIntArrayElements(ids, &outputCopy);
92 	jfloat* const y1 = env->GetFloatArrayElements(scores, &outputCopy);
93 	jfloat* const y2 = env->GetFloatArrayElements(boxes, &outputCopy);
94 
95 	detect_counts = yolo_post_process((char *)grid0_buf, (char *)grid1_buf, (char *)grid2_buf,
96 									  (int *)y0, (float *)y1, (float *)y2);
97 
98 	env->ReleaseByteArrayElements(grid0_out, grid0_buf, JNI_ABORT);
99 	env->ReleaseByteArrayElements(grid1_out, grid1_buf, JNI_ABORT);
100 	env->ReleaseByteArrayElements(grid2_out, grid2_buf, JNI_ABORT);
101 	env->ReleaseIntArrayElements(ids, y0, 0);
102 	env->ReleaseFloatArrayElements(scores, y1, 0);
103 	env->ReleaseFloatArrayElements(boxes, y2, 0);
104 
105 	return detect_counts;
106 }
107 
108 extern "C"
Java_com_rockchip_gpadc_demo_tracker_ObjectTracker_native_1create(JNIEnv * env,jobject obj)109 JNIEXPORT jlong JNICALL Java_com_rockchip_gpadc_demo_tracker_ObjectTracker_native_1create
110                                                             (JNIEnv * env, jobject obj) {
111     return create_tracker();
112 }
113 
114 extern "C"
Java_com_rockchip_gpadc_demo_tracker_ObjectTracker_native_1destroy(JNIEnv * env,jobject obj,jlong handle)115 JNIEXPORT void JNICALL Java_com_rockchip_gpadc_demo_tracker_ObjectTracker_native_1destroy
116                                                             (JNIEnv * env, jobject obj,
117                                                             jlong handle) {
118     destroy_tracker(handle);
119 }
120 
121 
122 extern "C"
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)123 JNIEXPORT void JNICALL Java_com_rockchip_gpadc_demo_tracker_ObjectTracker_native_1track
124                                                             (JNIEnv * env, jobject obj,
125                                                                   jlong handle,
126                                                                   jint maxTrackLifetime,
127                                                                   jint track_input_num,
128                                                                   jfloatArray track_input_locations,
129                                                                   jintArray track_input_class,
130                                                                   jfloatArray track_input_score,
131                                                                   jintArray track_output_num,
132                                                                   jfloatArray track_output_locations,
133                                                                   jintArray track_output_class,
134                                                                   jfloatArray track_output_score,
135                                                                   jintArray track_output_id,
136                                                                   jint width,
137                                                                   jint height) {
138 
139 	jboolean inputCopy = JNI_FALSE;
140 	jfloat *const c_track_input_locations = env->GetFloatArrayElements(track_input_locations,
141 																	   &inputCopy);
142 	jint *const c_track_input_class = env->GetIntArrayElements(track_input_class, &inputCopy);
143 	jfloat *const c_track_input_score = env->GetFloatArrayElements(track_input_score, &inputCopy);
144 	jboolean outputCopy = JNI_FALSE;
145 
146 	jint *const c_track_output_num = env->GetIntArrayElements(track_output_num, &outputCopy);
147 	jfloat *const c_track_output_locations = env->GetFloatArrayElements(track_output_locations,
148 																		&outputCopy);
149 	jint *const c_track_output_class = env->GetIntArrayElements(track_output_class, &outputCopy);
150 	jfloat *const c_track_output_score = env->GetFloatArrayElements(track_output_score, &inputCopy);
151 	jint *const c_track_output_id = env->GetIntArrayElements(track_output_id, &outputCopy);
152 
153 
154 	track(handle, (int)maxTrackLifetime,
155 	        (int) track_input_num, (float *) c_track_input_locations, (int *) c_track_input_class, (float *)c_track_input_score,
156 		    (int *) c_track_output_num, (float *) c_track_output_locations, (int *) c_track_output_class, (float *)c_track_output_score,
157 		    (int *) c_track_output_id, (int) width, (int)height);
158 
159 	env->ReleaseFloatArrayElements(track_input_locations, c_track_input_locations, JNI_ABORT);
160 	env->ReleaseIntArrayElements(track_input_class, c_track_input_class, JNI_ABORT);
161     env->ReleaseFloatArrayElements(track_input_score, c_track_input_score, JNI_ABORT);
162 
163 	env->ReleaseIntArrayElements(track_output_num, c_track_output_num, 0);
164 	env->ReleaseFloatArrayElements(track_output_locations, c_track_output_locations, 0);
165 	env->ReleaseIntArrayElements(track_output_class, c_track_output_class, 0);
166     env->ReleaseFloatArrayElements(track_output_score, c_track_output_score, 0);
167 	env->ReleaseIntArrayElements(track_output_id, c_track_output_id, 0);
168 }
169 extern "C"
170 JNIEXPORT jint JNICALL
Java_com_rockchip_gpadc_demo_rga_RGA_color_1convert_1and_1flip(JNIEnv * env,jclass clazz,jbyteArray src,jint src_fmt,jbyteArray dst,jint dst_fmt,jint width,jint height,jint flip)171 Java_com_rockchip_gpadc_demo_rga_RGA_color_1convert_1and_1flip(JNIEnv *env, jclass clazz,
172                                                                jbyteArray src, jint src_fmt,
173                                                                jbyteArray dst, jint dst_fmt,
174                                                                jint width, jint height, jint flip) {
175 	jboolean copy = JNI_FALSE;
176 	jbyte* src_buf = env->GetByteArrayElements(src, &copy);
177 	jbyte* dst_buf = env->GetByteArrayElements(dst, &copy);
178 
179 	jint ret = colorConvertAndFlip(src_buf, src_fmt, dst_buf, dst_fmt, width, height, flip);
180 
181 	env->ReleaseByteArrayElements(src, src_buf, 0);
182 	env->ReleaseByteArrayElements(dst, dst_buf, 0);
183 
184 	return ret;
185 }