在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. winform解析json API数据

    {  "retCode" : "SUCCESS",  "msg" : "",  "data" : { ...

  2. ElasticSearch 中的 Mapping

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

  3. 关于Java高并发编程你需要知道的“升段攻略”

    关于Java高并发编程你需要知道的"升段攻略" 基础 Thread对象调用start()方法包含的步骤 通过jvm告诉操作系统创建Thread 操作系统开辟内存并使用Windows ...

  4. 清晰图解深度分析HTTPS原理

    前言 很高兴遇见你~ Https现在基本已经覆盖所有的http请求了,作为一个伟大的发明,保障了我们的通信安全.在Android中对于HTTPS其实感知不多,因为这些内容都有成熟的框架帮我们完成了,例 ...

  5. System.Net.Mail邮件发送抄送附件(多个)

    /// <summary> /// 邮件发送抄送附件 /// </summary> /// <param name="mailTo">收件人(可 ...

  6. 痞子衡嵌入式:盘点国内Cortex-M内核MCU厂商高性能产品

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是国内Cortex-M内核MCU厂商高性能产品. 在8/16位中低端MCU领域,国内厂商的本土化产品设计以及超低价特点,使得其与国外大厂竞 ...

  7. C# 基础 - 文件对话框

    using System.Windows.Forms; ... /// <summary> /// 选择保存文件的名称以及路径 取消返回 空""; /// </s ...

  8. LNMP配置——Nginx配置 ——Nginx防盗链

    一.配置 #vi /usr/local/nginx/conf/vhost/test.com.conf 写入: server { listen 80; server_name test.com test ...

  9. Servlet原理解析&使用指南

    Servlet(Server Applet)全称Java Servlet,是用Java编写的服务器端程序.广义上指任何实现了Server接口的类,主要功能在于交互式地浏览和生成数据,生成动态Web内容 ...

  10. 热更新基础--AssetBundle学习笔记

    一.简介 AssetBundle简称AB包,特定平台的资产压缩包(包括模型.贴图.预设体.音效.材质球等资产). 作用:Resources下的资源只读且打包后不可修改,而AB包存储位置自定,后期可以动 ...