JNI hashmap object callback to java
2016-06-02 11:28
633 查看
1.JAVA code
2.native code
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;
}
/**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;
}
相关文章推荐
- detection/region/object prosoal方法综述文章
- GitHub前50名的Objective-C动画相关库
- iOS--动画--GitHub前50名的Objective-C动画相关库
- Object-C 中各数据类型转换 NSData转NSString,Byte,UIImage
- Objective-C消息转发
- 1.解剖Linq to object
- GitHub前50名的Objective-C动画相关库
- Java.lang.Object 类
- object c中的多态
- 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 
- 使用Objective-C的+(void)initialize初始化static变量
- objectForKey与valueForKey在NSDictionary中的差异
- IOS——objc_setAssociatedObject关联的使用
- Objective-C中的浅拷贝和深拷贝
- Objective-C 中 +load 与 +initialize
- Objective-C 神在细节之中
- 鸟哥Java学习之Object类-面向对象
- ios中object c纯代码开发屏幕适配处理方法
- READING NOTE: Inside-Outside Net: Detecting Objects in Context with Skip Pooling and Recurrent Neura
- List<Map<String,Object>>使用Java代码遍历以获取String,Object的值