只是为了记录JNI开发中的点击。
JNI调用Java方法这里就不介绍了,贴一个比较好的文章,写的比较全面的。
这里主要是记录自己遇到的一个,也许正巧刚接触JNI调用Java的你,正好也遇到了。YY一下,不介意吧。
1.慎用Get|ReleasePrimitiveArrayCritical(),建议使用Get|ReleaseByteArrayElements
在Get和 Release周期之间, 不允许阻塞调用(blocking calls)。导致最直接的影响就是,无法调用CallVoidMethod。
2.多线程问题
获取JavaVM *g_jvm , jobject g_obj
JNIEXPORT jint JNICALL Java_xx_Xx(JNIEnv *env,jobject thiz){
env->GetJavaVM(&g_jvm);
g_obj = env->NewGlobalRef(thiz);
}
pthread中方法 调用Java需按照如下处理
JNIEnv * env;
if (g_jvm->AttachCurrentThread(&env, NULL) == JNI_OK) {
jclass clazz = env->FindClass("XXX");
jmethodID methodId = env->GetMethodID(clazz, "methodName", "(II)V");
env->CallVoidMethod(g_obj, methodId ,1,1);
env->ExceptionClear();
g_jvm->DetachCurrentThread();
}