在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失败的更多相关文章

  1. Java程序中解决数据库超时与死锁

    Java程序中解决数据库超时与死锁 2011-06-07 11:09 佚名 帮考网 字号:T | T   Java程序中解决数据库超时与死锁,每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况 ...

  2. Java Web中解决乱码的方式

    Java Web中解决乱码的方式 方式一:添加编码过滤器 package com.itmacy.dev.filter; import javax.servlet.*; import javax.ser ...

  3. 实现apk 调用framework java JNI中方法

    首先整个实现需要有Android源码编译环境.这里我用的是froyo2.2. 1.JNI层--C++代码部分 在目录frameworks/base/core/jni 下创建android_jnidem ...

  4. JNI加载Native Library 以及 跨线程和Qt通信

    Part1 Java Native Interface-JNI-JAVA本地调用 JNI标准是Java平台的一部分, 允许Java代码和其他语言进行交互; 开始实现-> Step 1) 编写Ja ...

  5. C#中利用委托实现多线程跨线程操作

    在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个 ...

  6. WPF中窗口控件的跨线程调用

    在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可. 在WPF中要麻烦一下,同样的不允许跨线程访问,因为没 ...

  7. Java开发中解决Js的跨域问题

    主流方法有JSONP和CORS两种,这里记一下后者的方式,理论基础就是在请求的时候在http请求头中添加如下属性: //指定允许其他域名访问 Access-Control-Allow-Origin:h ...

  8. JAVA Eclipse中的Android程序如何使用线程

    我们先单独定义一个java类,名字可以任意取(比如叫做ClientHeartBeat类,我当前在做一个socket通信的客户端,我们假定需要一个可以测试心跳的程序),注意他要继承Thread,然后重载 ...

  9. 分析java程序中cpu占用过高的线程

    http://blog.csdn.net/jgwei/article/details/12079147 http://hllvm.group.iteye.com/group/topic/38893 h ...

随机推荐

  1. 小记一下递归通过id寻找一条链路的数据

    Array.prototype.remove = function(val) { var index = this.indexOf(val); if (index > -1) { this.sp ...

  2. ElasticSearch 中的 Mapping

    公号:码农充电站pro 主页:https://codeshellme.github.io 1,ES 中的 Mapping ES 中的 Mapping 相当于传统数据库中的表定义,它有以下作用: 定义索 ...

  3. Java基础语法:类型转换

    由于Java是强类型语言,所以有时候在进行运算时,需要用到类型转换. 整型.常量.字符类型数据可以混合运算. 运算中,不同类型的数据先转化为同一类型,然后再进行运算. 类型转换等级有低级到高级的划分, ...

  4. CSS 书写禅机

    这是未来的趋势所向,如是我行. 注意:原文发表于 2017-9-6,随着框架不断演进,部分内容可能已不适用. CSS 日渐惹人憎恶. 究其原因颇多,归根结底,皆因 CSS 给人的感觉总是飘渺迷蒙.变幻 ...

  5. 后端程序员之路 5、.conf、libconfig

    .conf在linux里随处可见,作用基本跟windows的.ini差不多 libconfighttp://www.hyperrealm.com/libconfig/libconfig_manual. ...

  6. 12. Vue搭建本地服务

    一. 搭建本地服务器 本地服务可以提高开发效率. webpack不需要每次都打包, 就可以看到修改后的效果. 本地服务器基于node.js搭建, 内部使用二十express框架. 可以实现让浏览器自动 ...

  7. Boltdb学习笔记之〇--概述

    更多精彩内容,请关注微信公众号:后端技术小屋 看了boltdb也有一阵子了,看完之后总想写点什么,因为感觉到这可能是个不小的坑,所以迟迟没有动笔(没错我的拖延症又犯了..).最近有一种流行的说法:如果 ...

  8. 通达OA后台getshell

    GIF演示图 https://github.com/jas502n/OA-tongda-RCE/blob/master/Auth-Getshell.gif 1.通过弱口令或其它手段进入后台 2.选择  ...

  9. 微服务分布式事务之LCN、TCC

    在亿级流量架构之分布式事务解决方案对比中, 已经简单阐明了从本机事务到分布式事务的演变过程, 文章的最后简单说明了TCC事务, 这儿将会深入了解TCC事务是原理, 以及理论支持, 最后会用Demo举例 ...

  10. Qt3D使用assimp加载常规模型文件

    Qt3D使用assimp加载三维模型文件,assimp支持很多常规格式的三维模型格式: 其中支持导入的格式有: 3D 3DS 3MF AC AC3D ACC AMJ ASE ASK B3D BLEND ...