JAVA JNI 中解决在C/C++跨线程FindClass失败
在JAVA与C/C++交互时使用JNI接口;
先是在JAVA调用的C++方法中直接测试FindClass,使用获取到的jclass操作没有任何问题;
但是在调用的C++方法中起线程后,在线程中FindClass有一定概率异常。
经过一天的时间,在网上查找资料并反复调试,终于解决了问题。
步骤如下:
① C++代码主线程中的操作:
///> 定义一个全局JavaVM *类型变量 Jvm,在主线程中获取JAVA虚拟机。
env->GetJavaVM(&Jvm);
///> 定义一个全局jobject类型变量 JObj,在主线程中保存JAVA传递过来的jobject。
JObj = env->NewGlobalRef(instance);
///> 定义一个局部变量保存FindClass的结果。
jclass tmpeClass = env->FindClass("com/myfile/Service/myclass");
///> 定义一个jclass 类型的全局变量JClass来保存FindClass结果的引用,保证在其他线程也能使用。
JClass = (jclass)env->NewGlobalRef(tmpeClass); ///> 注意!!!要把结果转换为jclass类型!
///> 然后就可以起线程了,起线程不在此赘述。
pthread_create(&myThread, NULL, thread_function, NULL);
② thread_function线程中的操作:
///> 将主线程中保存的Jvm中的JNIEnv取出来
JNIEnv *env;
Jvm->AttachCurrentThread((void **)&env, NULL);
///> 使用保存的全局JClass获取其中的属性ID
jfieldID ageFID = env->GetFieldID(JClass , "age", "B");
///> 使用此JClass申请对象。
jobject newObject = env->AllocObject(JClass);
///> 给该对象设置值。
env->SetByteField(newObject, ageFID , 30);
///> 获取JAVA提供的方法
jclass clazz = env->GetObjectClass(JObj);
jmethodID javaMID = env->GetMethodID(clazz, "CallMe", "(Lcom/myfile/Service/myclass;)V"); ///> 该方法的参数是FindClass的类
///> 最后就可调用JAVA提供的方法把赋好值的对象传递给JAVA。
env->CallVoidMethod( JObj, javaMID , newObject);
JAVA JNI 中解决在C/C++跨线程FindClass失败的更多相关文章
- Java程序中解决数据库超时与死锁
Java程序中解决数据库超时与死锁 2011-06-07 11:09 佚名 帮考网 字号:T | T Java程序中解决数据库超时与死锁,每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况 ...
- Java Web中解决乱码的方式
Java Web中解决乱码的方式 方式一:添加编码过滤器 package com.itmacy.dev.filter; import javax.servlet.*; import javax.ser ...
- 实现apk 调用framework java JNI中方法
首先整个实现需要有Android源码编译环境.这里我用的是froyo2.2. 1.JNI层--C++代码部分 在目录frameworks/base/core/jni 下创建android_jnidem ...
- JNI加载Native Library 以及 跨线程和Qt通信
Part1 Java Native Interface-JNI-JAVA本地调用 JNI标准是Java平台的一部分, 允许Java代码和其他语言进行交互; 开始实现-> Step 1) 编写Ja ...
- C#中利用委托实现多线程跨线程操作
在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个 ...
- WPF中窗口控件的跨线程调用
在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可. 在WPF中要麻烦一下,同样的不允许跨线程访问,因为没 ...
- Java开发中解决Js的跨域问题
主流方法有JSONP和CORS两种,这里记一下后者的方式,理论基础就是在请求的时候在http请求头中添加如下属性: //指定允许其他域名访问 Access-Control-Allow-Origin:h ...
- JAVA Eclipse中的Android程序如何使用线程
我们先单独定义一个java类,名字可以任意取(比如叫做ClientHeartBeat类,我当前在做一个socket通信的客户端,我们假定需要一个可以测试心跳的程序),注意他要继承Thread,然后重载 ...
- 分析java程序中cpu占用过高的线程
http://blog.csdn.net/jgwei/article/details/12079147 http://hllvm.group.iteye.com/group/topic/38893 h ...
随机推荐
- Oracle VM VirtualBox安装CentOS7
安装VirtualBox6.0 下载地址:https://www.virtualbox.org/ 新建虚拟机 类型:Linux 版本:Other Linux(64-bit)----如果没有出现64-b ...
- 带你认识webpack
一.webpack是什么 webpack是一种前端资源构建工具,一个静态模块打包器(module bundler).在webpack看来,前端的所有资源文件(js/json/css/img/less/ ...
- Linux Cron 定时任务
作者:丁仪 来源:https://chengxuzhixin.com/blog/post/LinuxCron-ding-shi-ren-wu.html 定时任务是经常被用到的,比如系统备份.数据导出等 ...
- Java基础语法:注释
书写注释是一个非常好的习惯. 注释并不会被执行,是给我们写代码的人看的. Java中的注释有三种: 单行注释(Line comment) 多行注释(Block comment) 文档注释(JavaDo ...
- springboot的4种属性注入
1.Autowired注入 2.构造方法注入 3.@Bean方法形参注入 4.直接在@Bean方法上使用注解@ConfigurationProperties(prefix="jdbc&quo ...
- windows本地连接虚拟机上的ubuntu的redis,以及无法连接解决方法(redisDesktopManager Jedis详细步骤)
一.环境 1.ubuntu20.04 . redis 5.0.7 在ubuntu上下载redis,执行命令 sudo apt install redis 2.redisDesktopManager下载 ...
- 使用python进行接口自动化测试,批量执行测试用例
工作中,使用python的requests库进行接口自动化测试是一个比较不错的选择,今天就以某网站的免费接口为例,展示以get请求进行批量执行测试用例.话不多说直接开讲 分析一下接口信息, 请求地址: ...
- 【转载】Java泛型详解
[转载]http://www.importnew.com/24029.html 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考 ...
- 02----python入门----基本数据类型
关于数据分类依据 一.数字型(int) Python可以处理任意大小的正负整数,但是实际中跟我们计算机的内存有关,在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,在64位系 ...
- Windows搭建flutter开发环境以及android&idea配置
Flutter:是谷歌新推出的一款能够支持Android和IOS跨平台开发的全新的UI框架. 拥有自己的一套UI渲染引擎,所以目前的测试数据来看,在性能上面,并没有比原生App性能低多少,所以目前来看 ...