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 ...
随机推荐
- [C++11]shared_ptr循环引用导致内存泄露
1 /* 2 * shared_ptr循环引用导致内存泄露 3 */ 4 5 struct A 6 { 7 shared_ptr<A> ptr; // 改为weak_ptr<A> ...
- Vue Study [2]: Vue Router
Description The article for vue router. Original post link:https://www.cnblogs.com/markjiang7m2/p/10 ...
- hdu1798(圆的位置关系)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1798 题意:给出两个圆的圆心坐标与半径,求他们相交部分的大小 思路:有三种情况: 1. 两圆相离,ar ...
- loj #6261 一个人的高三楼 FFT + 组合数递推
\(\color{#0066ff}{ 题目描述 }\) 一天的学习快要结束了,高三楼在晚自习的时候恢复了宁静. 不过,\(HSD\) 桑还有一些作业没有完成,他需要在这个晚自习写完.比如这道数学题: ...
- java.sql.Date/ java.util.Date/ java.util.Calendar 用法与区别
在 JDK API 这样解释," 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值.它也允许格式化和解析日期字符串.不过,这些函数的 ...
- JavaScript Succinctly 读后笔记
1.JavaScript does not have block scope 2.Scope is determined during function definintion, not invo ...
- Sharepoint 页面超链接地址打开
SharePoint页面: http://test:81/pages/nihao.aspx 页面超链接:<a href="www.baidu.com" >百度</ ...
- HDU-Fibonacci Again(打表找规律)
There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2). ...
- Oracle table-lock的5种模式
Oracle中的锁定可以分为几类: 1.DML lock(data lock), 2.DDL lock(dictionary lock) 3.internal lock/latch. DML lock ...
- 关于pycharm使用sqlite数据可视化的使用
如图