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, ©);
177 jbyte* dst_buf = env->GetByteArrayElements(dst, ©);
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 }