您的位置:首页 > 移动开发 > Objective-C

JNI hashmap object callback to java

2016-06-02 11:28 633 查看
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);
//            Dbug.i(tag, "onVideoReceive============date=" + dateStr + ", format time=" + date.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
}

/**Called from native code.*/
protected void onAudioReceive(HashMap hashMap) {

Dbug.i(tag, "onAudioReceive============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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: