惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Schneier on Security
N
News and Events Feed by Topic
量子位
S
Secure Thoughts
V2EX - 技术
V2EX - 技术
Hugging Face - Blog
Hugging Face - Blog
S
Security Affairs
J
Java Code Geeks
Schneier on Security
Schneier on Security
Google Online Security Blog
Google Online Security Blog
TaoSecurity Blog
TaoSecurity Blog
小众软件
小众软件
S
SegmentFault 最新的问题
www.infosecurity-magazine.com
www.infosecurity-magazine.com
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Privacy International News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
博客园 - 聂微东
T
Tor Project blog
博客园 - Franky
C
CERT Recently Published Vulnerability Notes
Cyberwarzone
Cyberwarzone
罗磊的独立博客
博客园_首页
The Cloudflare Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
大猫的无限游戏
大猫的无限游戏
Forbes - Security
Forbes - Security
V
Vulnerabilities – Threatpost
Security Latest
Security Latest
腾讯CDC
Simon Willison's Weblog
Simon Willison's Weblog
S
Securelist
博客园 - 【当耐特】
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
博客园 - 司徒正美
AWS News Blog
AWS News Blog
WordPress大学
WordPress大学
Jina AI
Jina AI
G
GRAHAM CLULEY
V
V2EX
L
LINUX DO - 最新话题
H
Heimdal Security Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家

博客园 - Jans

Flutter运行时闪退 利用 Python 爬虫来对文本进行批量化翻译 Thinkpad T460声音问题 Error 56: The Cisco Systems, Inc. VPN Service has not been started(Cisco VPN在Vista/Win 7下出现Error 56的解决办法) - Jans Weblogic中配置Active Directory Authentication Provider weblogic 10.3.5重置密码 在基于WCF开发的Web Service导出WSDL定义问题及自定义wsdl:port 名称 (转)Java实现Web Service过程中处理SOAP Header的问题 Geek to Live: Set up your personal Wikipedia (转)GitHub上整理的一些工具,求补充 - (转)老衣的开发工具和类库集之2014版 GCC的内存边界对齐 如何删除Weblogic域 电蚊拍选购参考 Localizing WPF with .resx files C#操作串口总结 ASP.NET MVC的国际化问题 小众的分布式版本管理工具Code Co-op 关于效率长尾现象
JNI:在线程或信号处理函数中访问自定义类
Jans · 2015-07-24 · via 博客园 - Jans
在写一个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);
    ...
}

  完。