JNI hashmap object callback to java

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值