在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. 如何将IHttpHandler和IHttpModule迁移到ASP.NET Core中间件

    ASP.NET Core是一个跨平台.开源的框架,用于在Windows.Mac和Linux操作系统(OS)上开发web应用程序.你可以使用以下任何IDE开发ASP.NET Core 应用程序: Vis ...

  2. PowerDesigner 设计数据库中常用脚本

    PowerDesigner 设计数据库中常用脚本 数据库设计 物理模型设置 Name转Comment脚本 '********************************************** ...

  3. XXL-JOB v2.3.0 发布 | 易用性增强

    转: XXL-JOB v2.3.0 发布 | 易用性增强 v2.3.0 Release Notes 1.[新增]调度过期策略:调度中心错过调度时间的补偿处理策略,包括:忽略.立即补偿触发一次等: 2. ...

  4. vscode undefined reference to `_imp__WSAStartup@8

    vscode undefined reference to `_imp__WSAStartup@8' 使用vscode和g++编译.cpp时,报出如题错误,如下图: 查了百度之后,在.vscode/t ...

  5. 如何在netcore下,愉快的使用IServiceProvider

    之前一直做dotnet framework开发,依赖注入使用Autofac,Autofac的一般用法是服务启动时,将用到的接口.实现类名注入进去, 然后在服务其他地方如果使用该类时,直接在Contai ...

  6. CCF(压缩编码):动态规划+平行四边形优化

    压缩编码 201612-4 一开始看这题还以为是哈夫曼编码的题目,结果是哈夫曼题目的变形. 哈夫曼编码是每次合并任意两堆石子,而这里的题目是合并相邻的两堆石子,而且这里的合并花费是合并两堆石子加上所有 ...

  7. 追溯 MySQL Statement Cancellation Timer

    原文 1. 背景 在 jstack 的内容中可以看到以下的 MySQL Statement Cancellation Timer 守护线程, 在业务高峰期的时候会出现大量的这类守护线程, 由此追溯该线 ...

  8. ClickHouse元数据异常-MySQLHandlerFactory:Failed to read RSA key pair from server

    Clickhouse版本:20.3.6.40-2 clickhouse集群三个节点,一分片,三副本,三个节点数据完全一样 1. 问题描述 在使用连接工具操作时,发现其中一个节点连接拒绝,无法操作,另外 ...

  9. YoloV3 记录

    常用于目标检测,因为最近要从目标分类问题转到目标检测中去. tensoflow.Keras(大公司一般都用这个).pytorch(本次学习)------------------主要框架 程序设计模块规 ...

  10. CSS水平布局

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...