JNI:在线程或信号处理函数中访问自定义类
在写一个Tomcat应用,类需要被信号处理函数回调,可是在单独的程序中测试没用问题:
void OnSingalHandler(int sig)
{
...
JNIEnv* env=NULL;
if (g_VM->AttachCurrentThread((void**)&env, NULL) != JNI_OK)
{
printf("AttachCurrentThread failed!\n");
} jclass cls = env->FindClass("nms/scada/Rtdb");
jmethodID callback = env->GetStaticMethodID(cls,"RealDataChange","(Ljava/lang/String;)V");
env->CallStaticVoidMethod(cls,callback,CStr2Jstring(env,xmlDoc.GetDoc().c_str())); g_VM->DetachCurrentThread(); ... }
一切安好,可是移到Tomcat中时,FindClass就不工作了,无论如何返回都是NULL,看网上说是因为Tomcat的ClassLoader不一样了,种种,试了好久未果。
后来发现即使是在Tomcat中,在JNI_OnLoad函数依然可以用FindClass调用成功,唯独在线程或者信号处理函数中有问题,或许是和AttachCurrentThread有关系吧。
于是想用全局变量缓存JNI_OnLoad中FindClass的结果,结果失败。
后来又有人说全局变量缓存是可以用的,不过要用NewGlobalRef创建全局对象引用,查了一下NewGlobalRef的定义:
jobject NewGlobalRef(jobject obj);
根本就没有给jclass用的啊,于是又开始乱找原因,试着用Tomcat的ClassLoader什么的原因。最终也没有成功。
又不甘心,查看jobject和jclass尼玛,原来是一回事
typedef jobject jclass;
好了,一用,妥妥的成功了。
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
...
jclass classClass = env->FindClass("nms/scada/Rtdb");
g_Class = (jclass)env->NewGlobalRef((jobject)classClass);
...
}
完。
JNI:在线程或信号处理函数中访问自定义类的更多相关文章
- 除了信号触发线程与接收者线程相同的情况能直接调用到slot,其它情况都依赖事件机制(解决上面代码收不到信号的问题其实很简单,在线程的run();函数中添加一个事件循环就可以了,即加入一句exec();),信号槽不就是一个回调函数嘛
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { pThreadCon = new CSerialThread ...
- 在信号处理函数中调用longjmp
错误情况及原因分析 前两天看APUE的时候,有个程序要自己制作一个sleep程序,结果在这个程序中就出现了在信号处理函数中调用longjmp函数的情况,结果就出现了错误,具体错误是啥呢,请参见下面这段 ...
- 回调函数中使用MFC类的成员或对话框控件的简单方法
在MFC的很多程序中,常常需要在回调函数中调用MFC类的类成员变量.类成员函数,亦或者对话框控件的句柄.由于回调函数是基于C编程的Windows SDK的技术,而类成员又有this指针客观条件限制.. ...
- cc31a_demo--CppPrimer_静态成员与继承-在派生类中访问基类中的static成员的方法
//*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的方法 //1.基类名::成员名 //2.子类名::成员名 //3.对象.成员名 //4.指针 ...
- QThread 与 QObject的关系(QObject可以用于多线程,可以发送信号调用存在于其他线程的slot函数,但GUI类不可重入)
QThread 继承 QObject..它可以发送started和finished信号,也提供了一些slot函数. QObject.可以用于多线程,可以发送信号调用存在于其他线程的slot函数,也可以 ...
- ruby在类中访问@,类外访问调用方法
class Box def initialize(w,h) @width,@height=w,h end def printWidth puts @width end def printHeight ...
- cocos2d-x 3.0 在lua中调用自定义类
环境 windows8, cocos2d-x 3.0, 现在开始安装需要的一些其它包 1. 按README.mdown文档上面要求的, 下载在windows下要安装的东东, 主要就是python2.7 ...
- YII中引用自定义类
如果通过actions方法引用其他自定义类时 <?php class LoginController extends Controller { public function actionInd ...
- WebService中使用自定义类的解决方法(5种)
转自:http://www.cnblogs.com/lxinxuan/archive/2007/05/24/758317.html Demo下载:http://files.cnblogs.com/lx ...
随机推荐
- mysql5.7 Your password does not satisfy the current policy requirements问题解决
安装mysql5.7rpm包,在更改密码的时候,提示错误 这是由于Mysql5.7默认对于密码的要求强度较高,设置的密码过于简单不予通过.要解决这个问题,涉及到的参数有validate_passwor ...
- 洛谷P3413 SAC#1 - 萌数(数位dp)
题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:1 ...
- CSS之引入样式
CSS引入样式 内部样式 内嵌式是将CSS代码集中写在HTML文档的head头部标签中,并且用style标签定义,其基本语法格式如下: <head> <style type=&quo ...
- springboot结合swagger生成接口文档
原文链接:https://www.cnblogs.com/xu-lei/p/7423883.html https://www.jianshu.com/p/b9ae3136b292 前后台分离的开发渐渐 ...
- 解释器模式Interpreter详解
原文链接:https://www.cnblogs.com/java-my-life/archive/2012/06/19/2552617.html 在阎宏博士的<JAVA与模式>一书中开头 ...
- jupyter notebook 设置默认目录
1.打开 cmd 输入命令 jupyter notebook --generate-config 可以看到生成文件的路径,这个就是生成的配置文件jupyter_notebook_config.py, ...
- springcloud系列五 feign远程调用服务
一:Feign简介 Feign 是一种声明式.模板化的 HTTP 客户端,在 Spring Cloud 中使用 Feign,可以做到使用 HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完 ...
- HDU 3709 Balanced Number 求区间内的满足是否平衡的数量 (数位dp)
平衡数的定义是指,以某位作为支点,此位的左面(数字 * 距离)之和 与右边相等,距离是指某位到支点的距离; 题意:求区间内满足平衡数的数量 : 分析:很好这又是常见的数位dp , 不过不同的是我们这次 ...
- Codeforces Round #305 (Div. 2) A
Description While Mike was walking in the subway, all the stuff in his back-bag dropped on the groun ...
- java算法外传之靠工资多久能实现小目标...
public static void main(String[] args) { //小目标 final int smallGoal=100_000_000; //月份 int month=1; // ...