Way 1:
1.JAVA code
/**Called from native code.*/
protected void onVideoReceive(HashMap hashMap) {
Integer timestamp = (Integer) hashMap.get("time");
int yearCode = ((timestamp >> 26) & 0b111111) + 2015;
int monthCode = (timestamp >> 22) & 0b1111;
int dayCode = (timestamp >> 17) & 0b11111;
int hourCode = (timestamp >> 12) & 0b11111;
int minCode = (timestamp >> 6) & 0b111111;
int secCode = (timestamp) & 0b111111;
String dateStr = String.format(Locale.getDefault(), "%04d%02d%02d%02d%02d%02d", yearCode, monthCode, dayCode, hourCode, minCode, secCode);
Date date = null;
try {
date = yyyyMMddHHmmss.parse(dateStr);
// Log.i(tag, "date=" + dateStr + ", format time=" + date.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
}
/**Called from native code.*/
protected void onAudioReceive(HashMap hashMap) {
Log.i(tag, "seq=" + hashMap.get("seq") + ", data=" + hashMap.get("data"));
}
2.native code
static jobject makeIntegerObject(JNIEnv *env, int32_t value) {/**Convert to Java Integer type*/
jclass clazz = (*env)->FindClass(env, "java/lang/Integer");
jmethodID integerConstructID = (*env)->GetMethodID(env, clazz, "<init>", "(I)V");
return (*env)->NewObject(env, clazz, integerConstructID, value);
}
/**C buffer convert to JAVA byte type*/
static jobject makeByteBufferObject(JNIEnv *env, const void *data, size_t size) {
jbyteArray byteArrayObj = (*env)->NewByteArray(env, size);
(*env)->SetByteArrayRegion(env, byteArrayObj, 0, size, (const jbyte *)data);
jclass clazz = (*env)->FindClass(env, "java/nio/ByteBuffer");
jmethodID byteBufWrapID = (*env)->GetStaticMethodID(env, clazz, "wrap", "([B)Ljava/nio/ByteBuffer;");
jobject byteBufObj = (*env)->CallStaticObjectMethod(env, clazz, byteBufWrapID, byteArrayObj);
(*env)->DeleteLocalRef(env, byteArrayObj);
byteArrayObj = NULL;
return byteBufObj;
}
static int on_video_rcv (void *data){
struct _data *pd = (struct _data *) data;
JNIEnv *env = NULL;
assert(java_vm != NULL);
(*java_vm)->AttachCurrentThread(java_vm, &env, NULL);
assert(env != NULL);
assert(pd != NULL);
jbyteArray jArray = (*env)->NewByteArray(env, pd->size);
assert(pd->data != NULL);
(*env)->SetByteArrayRegion (env, jArray, 0, pd->size, (jbyte*)(pd->data));
jclass class_hashmap = (*env)->FindClass(env, "java/util/HashMap");
jmethodID hashmap_init_id = (*env)->GetMethodID(env, class_hashmap, "<init>", "()V");
jobject hashMapObj = (*env)->NewObject(env, class_hashmap, hashmap_init_id, "");
jmethodID hashMap_put_id = (*env)->GetMethodID(env, class_hashmap, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
(*env)->CallObjectMethod(env, hashMapObj, hashMap_put_id, (*env)->NewStringUTF(env, "seq"), makeIntegerObject(env, pd->head.seq));
(*env)->CallObjectMethod(env, hashMapObj, hashMap_put_id, (*env)->NewStringUTF(env, "data"), jArray);
(*env)->CallObjectMethod(env, hashMapObj, hashMap_put_id, (*env)->NewStringUTF(env, "time"), makeIntegerObject(env, pd->head.date));
//(*env)->CallObjectMethod(env, hashMapObj, hashMap_put_id, (*env)->NewStringUTF(env, "type"), makeByteBufferObject(env, pd->head.type, 1));
(*env)->CallVoidMethod (env, gJavaObject, on_video_receive_method_id, hashMapObj);
(*env)->DeleteLocalRef(env, jArray);
(*env)->DeleteLocalRef(env, hashMapObj);
(*env)->DeleteLocalRef(env, class_hashmap);
if ((*env)->ExceptionCheck (env)) {
LOGE ("on_video_rcv: Failed to call ExceptionCheck");
(*env)->ExceptionClear (env);
}
//LOGE ("on_video_rcv ..end..");
(*java_vm)->DetachCurrentThread(java_vm);
return 1;
}
static int on_audio_rcv (void *data){
struct player_data *pd = (struct player_data *) data;
JNIEnv *env = NULL;
assert(java_vm != NULL);
(*java_vm)->AttachCurrentThread(java_vm, &env, NULL);
assert(env != NULL);
assert(pd != NULL);
jbyteArray jArray = (*env)->NewByteArray(env, pd->size);
assert(pd->data != NULL);
(*env)->SetByteArrayRegion (env, jArray, 0, pd->size, (jbyte*)(pd->data));
jclass class_hashmap = (*env)->FindClass(env, "java/util/HashMap");
jmethodID hashmap_init_id = (*env)->GetMethodID(env, class_hashmap, "<init>", "()V");
jobject hashMapObj = (*env)->NewObject(env, class_hashmap, hashmap_init_id, "");
jmethodID hashMap_put_id = (*env)->GetMethodID(env, class_hashmap, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
(*env)->CallObjectMethod(env, hashMapObj, hashMap_put_id, (*env)->NewStringUTF(env, "seq"), makeIntegerObject(env, pd->head.seq));
(*env)->CallObjectMethod(env, hashMapObj, hashMap_put_id, (*env)->NewStringUTF(env, "data"), jArray);
(*env)->CallObjectMethod(env, hashMapObj, hashMap_put_id, (*env)->NewStringUTF(env, "time"), makeIntegerObject(env, pd->head.date));
(*env)->CallVoidMethod (env, gJavaObject, on_audio_receive_method_id, hashMapObj);
(*env)->DeleteLocalRef(env, jArray);
(*env)->DeleteLocalRef(env, hashMapObj);
(*env)->DeleteLocalRef(env, class_hashmap);
if ((*env)->ExceptionCheck (env)) {
LOGE ("on_audio_rcv: Failed to call ExceptionCheck");
(*env)->ExceptionClear (env);
}
(*java_vm)->DetachCurrentThread(java_vm);
return 1;
}
Way 2:
1.Java Code:
javaCode.queryScore("hello", new JavaCode.OnPersonCallback () {
@Override
public void onData(Person person) {
}
});
public native void nativeQuery(String name, OnPersonCallback callback);
public interface OnPersonCallback {
void onData(Person person);
}
public void query(String name, OnPersonCallback callback) {
nativeQuery(name, callback);
}
2.Native code:
JNIEXPORT void JNICALL
Java_com_example_tool_JavaCode_nativeQuery(JNIEnv *env, jobject thiz, jstring jname,
jobject jcallback) {
const char *name = (*env)->GetStringUTFChars(env, jname, 0);
// do something
//jclass class_person = (*env)->FindClass(env, "com/example/model/Student");
// jclass class_callback = (*env)->FindClass(env, "com/example/callback/OnResultCallback");//jclass获取方式1:Interface是单独一个类
jclass class_callback = (*env)->FindClass(env, "com/example/tool/JavaCode$OnResultCallback");//jclass获取方式2:Interface被定义为内部类
// jclass class_callback = (*env)->GetObjectClass(env, jcallback);//jclass获取方式3:通过类对象的方式
jmethodID mid_callback = (*env)->GetMethodID(env, class_callback, "onData", "(Lcom/example/model/Person;)V");
(*env)->CallVoidMethod(env, jcallback, mid_callback, obj_student);
(*env)->ReleaseStringUTFChars(env, jname, name);
}
ref:Contentshttps://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html