如果是C/C++回调,你只要参考linux的线程指南,在线程函数中传入回调函数地址就行了。如果是要回调到Java层,稍微复杂点。 首先,你需要在onload的时候,找到回调函数所在的类,用全局变量保存: JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { LOGE("JNI_OnLoad start"); jint version; g_vm = vm; // 全局变量保存 JNIEnv *env; jobject cls; version = vm->GetEnv((void **)&env, JNI_VERSION_1_2); if (env) { g_clazz = env->FindClass(CLASS_CustomSurfaceView); // 全局变量保存 } LOGE("JNI_OnLoad finish g_clazz = 0x%x", g_clazz); return JNI_VERSION_1_2; } 在JNI启动线程的时候,需要把线程挂到JVM上,不然不能访问Java。你有了g_vm, g_clazz, 以及env,就可以做回调操作了。 // 线程函数 void *threadFunc(void *data) { JNIEnv *env = MNull; int ret = g_vm->AttachCurrentThread( (JNIEnv **) &env, MNull); // 挂到JVM if (ret < 0) { LOGE("fail to attach"); return; } // TODO: 在这里做你的回调操作 g_vm->DetachCurrentThread(); // 从JVM卸载 return;}
转至:http://zhidao.baidu.com/question/177324723737134804
如何在android的jni线程中实现回调
最新推荐文章于 2024-04-24 14:46:15 发布