首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Android NDK中跨线程共享JavaVM*

在Android NDK中跨线程共享JavaVM*的方法如下:

  1. 定义一个全局的JavaVM*变量,用于存储Java虚拟机的指针。
代码语言:c++
复制
JavaVM* g_JavaVM = nullptr;
  1. 在JNI_OnLoad函数中,将JavaVM*指针赋值给全局变量g_JavaVM。
代码语言:c++
复制
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
{
    g_JavaVM = vm;
    return JNI_VERSION_1_6;
}
  1. 在需要使用JavaVM的线程中,通过调用JNI_OnLoad函数获取JavaVM指针。
代码语言:c++
复制
JavaVM* GetJavaVM()
{
    if (g_JavaVM == nullptr)
    {
        // 调用JNI_OnLoad函数获取JavaVM*指针
        JNIEnv* env = nullptr;
        jint result = JNI_OnLoad(env, nullptr);
        if (result != JNI_VERSION_1_6)
        {
            return nullptr;
        }
    }
    return g_JavaVM;
}
  1. 在需要使用JavaVM的线程中,通过调用GetJavaVM函数获取JavaVM指针,然后使用JavaVM*指针进行相关操作。
代码语言:c++
复制
JavaVM* javaVM = GetJavaVM();
if (javaVM != nullptr)
{
    // 使用JavaVM*指针进行相关操作
}

注意:在使用JavaVM*指针进行操作时,需要确保线程安全,避免出现竞争条件等问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android NDK的UI线程

概述 Android,UI线程是一个很重要的概念。我们对UI的更新和一些系统行为,都必须在UI线程(主线程)中进行调用。...同时,我们进行底层平台开发时,我们会选择NDKLinux系统上进行开发。Linux是没有主线程这一概念的。...那么,如果我们线程调用了一个native方法,C++的代码,我们想要切换到主线程调用某个方法时,该如何切换线程呢? 需求 众所周知,Toast消息,是无法线程调用的。...通过初始的这样两个方法,我们就构建了一条通往主线程的通道。 发往主线程 初始化的方法,我们构筑了一条消息通道。接下来,我们就需要将消息发送至主线程。...目前,我能够想到的是,根据内容,handle_message实现“解包”。 总结 native层,想要切到主线程调用方法。其根本是应用启动时,就在主线程调用初始化,构建好一个消息通道。

2.5K40

Android JNI(一)——NDK与JNI基础

总之,Android的SDK之外,有一个工具就是NDK,用于进行C/C++的开发。一般情况,是用NDK工具把C/C++编译为.co文件,然后Java调用。...因为C语言的不平台,Mac系统的下使用NDK编译Linux下能执行的函数库——so文件。其本质就是一堆C、C++的头文件和实现文件打包成一个库。...因此,不同的线程的JNIEnv是不同,也不能相互共享使用。JNIEnv结构也是一个函数表,本地代码通过JNIEnv的函数表来操作Java数据或者调用Java方法。...JNIEnv是一个线程相关的结构体,该结构体代表了Java线程的执行环境 2.2、JNIEnv和JavaVM的区别: JavaVMJavaVM是Java虚拟机JNI层的代表,JNI全局仅仅有一个...所以JNIEnv不能线程

2.8K32
  • Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )

    前置知识点 : 参考 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 ) 博客内容 , 了解如何在 C++ 调用...JavaVM *vm ---- JavaVM *vm 获取方法 : JNI_OnLoad() 方法获取 ; //JNI_OnLoad 获取的 Java 虚拟机对象放在这里 JavaVM *javaVM...局部引用 与 全局引用 : JavaVM *vm , JNIEnv *env 与 jobject instance 是方法获取的 , 如果线程调用 , 就需要考虑其引用的类型 , 局部引用 或 全局引用...参考 : ① 局部引用 : 【Android NDK 开发】JNI 引用 ( 局部引用 | 局部引用作用域 | 局部引用产生 | 局部引用释放 | 代码示例) ② 全局引用 : 【Android NDK...vm->DetachCurrentThread(); 参考 : 【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv

    1K20

    Android NDK开发完全剖析

    之前的两篇文章主要介绍了音视频SDK线程设计和消息队列,其实对那些想从Android转向音视频开发的同学来说,NDK方面的知识是不得不提的“前置条件”,因为音视频开发的主要是C/C++开发,也许有些同学会反驳...我们这边需要着重记住的就是JavaVM一个进程只存在一个,这个很重要,JNI多线程需要这个作为基础。...JNIEnv 对应的是线程,一个线程对应一个JNIEnv对象,JNI多线程操作,一定要注意切换到当前线程的JNIEnv,因为JNIEnv用于线程本地存储,无法在线程之间共享JNIEnv, 那怎么获取当前线程的...JNI多线程: 我们经常遇到的一个场景是,JNI可能会开启一个线程,如何回调到Java层来?...还记得我们上面说到了JavaVMAndroid中一个进程保持一个JavaVM实例,说明JavaVM是进程间共享的,那我们JNI_OnLoad的时候需要将当前进程的JavaVM保存起来。

    1.9K10

    JNI 从入门到实践,万字爆肝详解!

    本文已收录到 GitHub · Android-NoteBook[1] 。 前言 Android 生态主要有 C/C++、Java、Kotlin 三种语言 ,它们的关系不是替换而是互补。...JavaVM 对象,JavaVM 可以线程共享; JNIEnv: 代表 Java 运行环境,每个 Java 线程都有各自独立的 JNIEnv 对象,JNIEnv 不可以线程共享。...由于 JavaVM 是进程共享的,因此全局引用可以方法和线程共享; JavaEnv 内有 locals 表管理局部引用,由于 JavaEnv 是线程独占的,因此局部引用不能线程。...7.1 不能线程的引用 JNI ,有 2 类引用是无法线程调用的,必须时刻谨记: JNIEnv: JNIEnv 只在所在的线程有效,不同线程调用 JNI 函数时,必须使用该线程专门的 JNIEnv...,不能线程使用。

    2.2K21

    Android 系统开发】Android JNI 之 JNIEnv 解析

    .jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 的一个文件, 位置是 $/android-ndk-r9d/platforms/android-19...JNIEnv 作用 JNIEnv 概念 : 是一个线程相关的结构体, 该结构体代表了 Java 线程的运行环境 ;  JNIEnv 与 JavaVM : 注意区分这两个概念;  -- JavaVM...: JavaVM 是 Java虚拟机 JNI 层的代表, JNI 全局只有一个; -- JNIEnv : JavaVM线程的代表, 每个线程都有一个, JNI 可能有很多个 JNIEnv; JNIEnv...JNIEnv 体系结构  线程相关 : JNIEnv 是线程相关的, 即 每个线程 都有一个 JNIEnv 指针, 每个JNIEnv 都是线程专有的, 其它线程不能使用本线程的 JNIEnv,...线程 A 不能调用 线程 B 的 JNIEnv; JNIEnv 不能线程 :  -- 当前线程有效 : JNIEnv 只在当前线程有效, JNIEnv 不能在 线程之间进行传递, 同一个线程,

    30331

    Android NDK 开发】 C 代码获取 Android 系统信息 ( NDK 项目创建 | NDK 配置 | 获取 Android 系统版本号 )

    创建 NDK 项目 II . NDK 项目 相关配置 III . NDK 获取 Android 版本号 IV . 使用 __system_property_get 可获取的参数 I ....创建支持 NDK 的项目 : 当前最新的 Android Studio 支持直接创建 支持 C/C++ 的带 NDK 配置的项目 ; 如果向现有项目加入 C/C++ 代码 , 首先要创建 cpp 代码文件..., 然后创建 CMakeList.txt 编译脚本 , 最后 build.gradle 配置该编译脚本 , 这里不再详细描述 ; 菜单栏中选择 File -> New -> New Project...NDK 获取 Android 版本号 ---- 1....参数字符串来源 : 上述的参数字符串都定义 Android 系统的 build.prop 配置文件 ; 4.

    1.9K20

    Android跨进程通信IPC之3——关于JNI的那些事

    其实不少的Java的程序员,享受着其平台性,可能全然不知JNI的存在。Android平台,让JNI大放异彩,为更多的程序员所数值,往往为了提供效率或者其他功能需求,就需要在NDK上开发。...第一个参数会传入JavaVM指针;第二种方式,native_code调用JNI_CreateJavaVM(&jvm,(void*)&env,&vm_args) 可以得到JavaVM指针。...但是,一个本地方法可能会被不同的Java线程调用,因此可以接受不同的JNIEnv。 和JNIEnv相比,JavaVM可以进程各个线程共享。...需要强调在Android SDK强调了额 " do not cache JNIEnv * ",要用的时候不同的线程通过JavaVM * jvm的方法来获取与当前线程相关的JNIEnv *。...Java里,每一个一个process可以产生多个JavaVM对象,但是android上,每一个process只有一个Dalvik虚拟机对象,也就是android进程是通过有且只有一个虚拟机对象来服务所有

    2.6K50

    NDK学习笔记:线程JNIEnv,JavaVM,JNI_OnLoad(GetEnv返回NULL?FindClass返回NULL?)

    NDK学习笔记:线程JNIEnv,JavaVM,JNI_OnLoad 此文章是关于NDK线程的第二篇理论知识笔记。...线程如何获取JNIEnv?GetEnv返回NULL? FindClass返回NULL ?...为了配合这种多执行绪的环境,C组件开发者撰写native函数时,可藉由JNIEnv指标值之不同而避免执行绪的资料冲突问题,才能确保所写的native函数能安全地Android的多执行绪VM里安全地执行...这里的JavaVM就是虚拟机VMJNI的表示,一个进程JVM只有一个JavaVM对象,这个对象是线程共享的。...既然env不是线程安全,不能直接引用。那么我们可以引用其他线程共享的调用对象啊,再通过GetObjectClass获取jclass。

    2.7K41

    NDK开发(九) :Hello jniCallback

    转载请以链接形式标明出处: 本文出自:103style的博客 本文操作以 Android Studio 3.5 版本为例 本文为参考官方示例 hello-jniCallback 动手写的 Demo.... ---- NDK开发(一) :NDK入门指南 NDK开发(二) :JNI的数据类型 NDK开发(三) :JNI访问Java变量和方法 NDK开发(四) :JNI操作Java数组 NDK开发(五) :...JNI实现文件加解密 NDK开发(六) :JNI实现文件拆分和合并 NDK开发(七) :JNI实现文件夹遍历 NDK开发(八) :JNI下Bitmap的使用 NDK开发(九) :Hello JniCallback...: 通过pthread_create创建线程的时候,第一个参数:线程id的指针;第二个参数:线程属性的指针;第一个参数:在线程运行的函数;第四个参数:运行函数的参数 extern "C" JNIEXPORT...NewGlobalRef(clz)); jniCallback.jniCallbackDemoObj = env->NewGlobalRef(instance); // StartTiming :在线程运行的函数

    34330

    JNI线程相关

    注:Android develop给的的编码建议是: 尽可能避免使用受管理编程语言编写的代码与使用 C++ 编写的代码之间进行异步通信。这样可使 JNI 接口更易于维护。...一种比较常见的应用场景是:native 层创建了线程线程执行完后想将结果返回给java层,这时线程是不能用jni函数参数的JNIEnv的,因为参数的JNIEnv属于不同的线程....在线程获取或创建JNIEnv 分两种情况 线程包含JNIEnv 如果一段代码无法通过其他方法获取自己的 JNIEnv,您应该共享相应 JavaVM,然后使用 GetEnv 发现线程的 JNIEnv...会阻止GC回收所引用的对象,不能在本地函数函数使用,不能线前使用。 函数返回后局部引用所引用的对象会被JVM自动释放....可以方法、线程使用。

    1.4K20

    Android JNI出坑指南

    Android编程,出于硬件交互,平台,安全性,第三方库等方面的考虑,我们需要Java与C/C++互相调用,这就需要借助Java平台的JNI接口(Java Native Interface)。...Android早期版本因JNI调用性能,native代码调试困难而被诟病,但近年来性能已经有不错的优化,Android NDK对C++开发支持也越来越好,特别是Android Studio上开发调试C...未调用DetachCurrentThread导致线程无法正常退出 natvie线程调用了AttachCurrentThread连接到虚拟机,但线程退出前未调用DetachCurrentThread取消连接...该指针只创建它的线程有效,不能线程传递。...Google官方JNI指南文档建议Android2.0以上可使用pthread_key,在线程析构时自动调用Detach以简化操作。

    4.4K71

    你应该了解的JNI知识(三)——注意点

    共享的,要使用该功能,需要在cmake引入库。...全局引用和局部引用 试想一种场景,JNI_OnLoad通过FindClass找到某一个类,然后用作静态变量,以后某个场景使用该静态场景,一些是不是设想的很美好,但在JNI环境是不行的。...会阻止GC回收所引用的对象,不在本地函数函数使用,不能线程使用。函数返回后局部引用所引用的对象会被JVM自动释放,或调用DeleteLocalRef释放。...可以方法、线程使用。JVM不会自动释放,必须调用DeleteGlobalRef手动释放。...弱全局引用:调用NewWeakGlobalRef基于局部引用或全局引用创建,不会阻止GC回收所引用的对象,可以方法、线程使用。

    1.2K70

    Radare2静态分析apk

    Android的so文件 在前面的文章,对so文件进行了基本的介绍。Android的so有点不一样。...JNIEnv基础 1.线程相关 : JNIEnv 是线程相关的, 即 每个线程 都有一个 JNIEnv 指针, 每个JNIEnv 都是线程专有的, 其它线程不能使用本线程的 JNIEnv, 线程...JNIEnv 不能线程 : •当前线程有效 : JNIEnv 只在当前线程有效, JNIEnv 不能在 线程之间进行传递, 同一个线程, 多次调用 JNI层方法, 传入的 JNIEnv 是相同的;...env指针指向一个函数指针表,VC可以直接用"->"操作符访问其中的函数。...参数: utf UTF编码的字符串指针,对于数值型参数,C/C++可直接使用 JNIEnv编程 通过ANdroid studio 新建c++项目,需要下载ndk和CMakelist。

    90130

    Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )

    线程方法获取 JNIEnv ---- 线程获取 JNIEnv * env 步骤 : ① JNIEnv 无法线程 : JNI 方法参数的 JNIEnv 指针是不能线程使用的 , 线程调用...代码示例 : /* 线程执行的方法 如果在 Native 层执行耗时操作 , 如下载文件 , 需要在线程处理 JNI 方法参数的 JNIEnv 指针是不能线程使用的 ,...线程调用 JNI 方法 , 其 JNIEnv 指针不能在子线程中使用 如果在子线程中使用 JNIEnv 指针 , 需要使用 JavaVM 获取 指定线程的 JNIEnv 指针...> //Java 虚拟机指针 , JNI_OnLoad 方法设置该值 JavaVM *_vm; //JNI 方法参数的第二个参数 , 需要先将局部变量转为全局变量 , 然后再其它方法调用..., 线程调用 JNI 方法 , 其 JNIEnv 指针不能在子线程中使用 如果在子线程中使用 JNIEnv 指针 , 需要使用 JavaVM 获取 指定线程的 JNIEnv 指针

    90520

    JNI编程如何巧妙获取JNIEnv

    JavaVM:Java虚拟机Native层的代表,Android中一个进程只有一个JavaVM,所有的线程共用一个JavaVM。...JNIEnv:Java调用Native语言的环境,是一个封装了几乎所有JNI方法的指针,每一个Java线程都有一个对应的JNIEnv,JNIEnv只在当前线程可用,不能线程使用,不同线程的JNIEnv...Native环境创建的线程,如果需要调用JNI方法,必须要调用AttachCurrentThread()与JVM进行关联,使用后也需要调用DetachCurrentThread()来解除关联。...小总结: Android进程Native层,通过任何一个可用的JNIEnv都可以获取到整个进程唯一的JavaVM,在任何线程中都可以通过JavaVM获取当前线程可用的JNIEnv,如果是Native...方法一:Android调用Native方法前通常都会先加载Native的动态链接库,通常都是使用这种方法: System.loadLibrary(xxx); 这个方法调用后Native层会自动调用

    4.7K30
    领券