在写一个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:在线程或信号处理函数中访问自定义类的更多相关文章

  1. 除了信号触发线程与接收者线程相同的情况能直接调用到slot,其它情况都依赖事件机制(解决上面代码收不到信号的问题其实很简单,在线程的run();函数中添加一个事件循环就可以了,即加入一句exec();),信号槽不就是一个回调函数嘛

    MainWindow::MainWindow(QWidget *parent) :   QMainWindow(parent)   {   pThreadCon = new CSerialThread ...

  2. 在信号处理函数中调用longjmp

    错误情况及原因分析 前两天看APUE的时候,有个程序要自己制作一个sleep程序,结果在这个程序中就出现了在信号处理函数中调用longjmp函数的情况,结果就出现了错误,具体错误是啥呢,请参见下面这段 ...

  3. 回调函数中使用MFC类的成员或对话框控件的简单方法

    在MFC的很多程序中,常常需要在回调函数中调用MFC类的类成员变量.类成员函数,亦或者对话框控件的句柄.由于回调函数是基于C编程的Windows SDK的技术,而类成员又有this指针客观条件限制.. ...

  4. cc31a_demo--CppPrimer_静态成员与继承-在派生类中访问基类中的static成员的方法

    //*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的方法 //1.基类名::成员名 //2.子类名::成员名 //3.对象.成员名 //4.指针 ...

  5. QThread 与 QObject的关系(QObject可以用于多线程,可以发送信号调用存在于其他线程的slot函数,但GUI类不可重入)

    QThread 继承 QObject..它可以发送started和finished信号,也提供了一些slot函数. QObject.可以用于多线程,可以发送信号调用存在于其他线程的slot函数,也可以 ...

  6. ruby在类中访问@,类外访问调用方法

    class Box def initialize(w,h) @width,@height=w,h end def printWidth puts @width end def printHeight ...

  7. cocos2d-x 3.0 在lua中调用自定义类

    环境 windows8, cocos2d-x 3.0, 现在开始安装需要的一些其它包 1. 按README.mdown文档上面要求的, 下载在windows下要安装的东东, 主要就是python2.7 ...

  8. YII中引用自定义类

    如果通过actions方法引用其他自定义类时 <?php class LoginController extends Controller { public function actionInd ...

  9. WebService中使用自定义类的解决方法(5种)

    转自:http://www.cnblogs.com/lxinxuan/archive/2007/05/24/758317.html Demo下载:http://files.cnblogs.com/lx ...

随机推荐

  1. myql 服务启动不了怎么办

    今天,不小心手动将mysql 服务停掉后,怎么也启动不了,后面查了半天 ,终于知道要先将任务管理器里的mysql.exe 先Kill掉,然后可以启动了,记录一下

  2. SoftKeyboard在AndroidStudio下的配置和运行

    前文翻译的<Android下创建一个输入法>一文中提到了来自Google的输入法例程SoftKeyboard,备忘下该程序的配置和运行. 首先将SoftKeyboard导入AndroidS ...

  3. LAMP实战之构建博客网站

    1.首先检查LAMP环境 [root@cairui htdocs]# ps -ef | grep httpd php Mar03 ? :: /opt/apache2.2.34/bin/httpd -k ...

  4. SpriteBuilder 不能 Portrait

    最近用最新的SpriteBuilder V1.3.6和Xcode 6.0.1,发现一个bug.就是在使用Xcode6的时候的SpriteBuilder已经在Project settings 里面设置了 ...

  5. ArcGIS-各类问题

    arcgis 10.4破解方法*注意!Desktop,Engine,Server必须为同一版本 1.先安装License10.4 2.再安装Desktop10.4 3.再安装Engine10.4 4. ...

  6. CF709B Checkpoints 模拟

    Vasya takes part in the orienteering competition. There are n checkpoints located along the line at ...

  7. 5.Min Stack(能返回最小数的栈)

    Level:   Easy 题目描述: Design a stack that supports push, pop, top, and retrieving the minimum element ...

  8. SSKeychain的使用 钥匙串

    一.首先要理解keychain与userdefaults的区别: 1.keychain是将数据加密后存储在本地,更安全.路径:Library/Application Support/iPhone Si ...

  9. 关于logrotate工具的日志切割

    logrotate是一个非常好的文件切割工具!! 具体配置如下: /var/log/debug.log{         daily            ; 每天转储         rotate ...

  10. vue安装常用插件命令

    1. 安装element-ui npm i element-ui -S 2. 安装vuex npm install vuex --save 3. 安装axios npm install --save ...