多线程JNI开发踩坑

本文介绍了在JNI开发中遇到的多线程问题,强调了JNIEnv是线程相关的变量,不能作为全局变量在不同线程间共享。解决方案包括定义全局JavaVM指针,并在回调函数中通过JavaVM获取当前线程的JNIEnv。此外,还提到了FindClass返回null的问题,以及如何处理全局引用的释放。
摘要由CSDN通过智能技术生成

一、前言

在JNI开发时,最重要的就是JNIEnv *env这个参数,它代表着Java本地接口环境(Java Native Interface Environment),通过它可以在native层中与java层进行交互。因此在每个定义的native方法中都有这个参数。

二、问题描述

在项目中遇到的一个问题就是在native层中的回调函数里调用java层的方法,实时向java层传输算法结果,这里就需要在回调函数中定义JNIEnv *env这个参数。我当时认为只要定义一个全局变量env,在其他方法中进行赋值,然后就能在回调函数中使用了,其实是错的!当然我也这么试了,最终结果是程序直接挂掉!

事实上,JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立。JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM,因此该进程的所有线程都可以使用这个JavaVM。当后台线程需要调用JNIEnv时,在native层中使用全局变量保存JavaVM尤为重要,这样使得后台线程能通过JavaVM获得JNIEnv。

三、问题解决

1、定义一个全局变量JavaVM:
JavaVM* g_jvm = NULL;
//在某个含有env环境的方法中获取JavaVM
env->GetJavaVM(&_jvm);
或者可以在JNI_OnLoad中进行赋值,因为它是最开始执行的函数

jint 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值