JNI调用Java过程中遇到的问题

只是为了记录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();

}

你可能感兴趣的:(JNI调用Java过程中遇到的问题)