• jni不通过线程c回调java的函数 --总结


    1、JNIEnv类型是一个指向全部JNI方法的指针。该指针只在创建它的线程有效,不能跨线程传递

    2、JavaVM是虚拟机在JNI中的表示,一个JVM中只有一个JavaVM对象,这个对象是线程共享的。

    通过JNIEnv我们可以获取一个Java虚拟机对象,其函数如下:

    jint GetJavaVM(JNIEnv *env, JavaVM **vm);

    3、JNIEnv指针仅在创建它的线程有效。如果我们需要在其他线程访问JVM,那么必须先调用AttachCurrentThread将当前线程与JVM进行关联,然后才能获得JNIEnv对象。当然,我们在必要时需要调用DetachCurrentThread来解除链接。

    jint AttachCurrentThread(JavaVM* vm , JNIEnv** env , JavaVMAttachArgs* args);

    • vm:虚拟机对象指针。
    • env:用来保存得到的JNIEnv的指针。
    • args:链接参数,参数结构体如下所示。
    • return:链接成功返回0,连接失败返回其他。 

    4、在AttachCurrentThread中c层回调java层的时候,要创建java层的对象只能使用jni不通过线程c回调java的函数博客中的env->findClass()的方式,这样会出现问题,不清楚的看博客http://blog.csdn.net/lipeng32768/article/details/42032073

    5、在android 8.0系统调试的时候,使用jni不通过线程c回调java的函数博客中方式进行回调,出现了问题,解决的办法是在c层使用pthread创建一个单独的线程进行回调。

  • 相关阅读:
    Windows10下Opencv4+CMake+MinGW64+VSC安装教程
    相机标定问题-实践操作流程
    eNSP仿真学习,网络入门!
    SFTP服务的使用!!
    树莓派B+使用入门&RPI库安装&wringPi库安装
    Python基本语法初试
    基于51单片机+DAC0832的信号发生器
    各种标志位的含义
    根文件系统ramdisk.image.gz && uramdisk.image.gz
    Linux中/etc/inittab文件
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/8328857.html
Copyright © 2020-2023  润新知