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,基本上知道如何使用了。照我的观点JNI还是不难的,难得只是我们一份尝试的心。 学习过程...
    皇小弟阅读 1,681评论 0 1
  • 要使用NDK首先要了解NDK到底是什么? (英语:native development kit,简称NDK)是一种...
    cuiandroid阅读 2,259评论 0 2
  • 1.在C/C++中实现本地方法 生成C/C++头文件之后,你就需要写头文件对应的本地方法。注意:所有的本地方法的第...
    JayQiu阅读 2,434评论 0 3
  • 2017.12.17日精进!今天有点忙!感觉总有事忘记去做!就是想不起来?做事要有计划!
    京心达YL阅读 182评论 0 0
  • 你离开后的第12天。 你出事后,我一直在心底绝望呐喊,让你出来跟我见上一面,什么样的形态都好。 可是连梦里你都没有...
    柯德莉L阅读 551评论 0 1