首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`JNI_OnLoad`总是在主线程中调用吗?

`JNI_OnLoad`总是在主线程中调用吗?
EN

Stack Overflow用户
提问于 2016-11-24 06:35:47
回答 1查看 782关注 0票数 2

JNI_OnLoad()总是在主线程中调用还是在System.load()/System.loadLibrary()调用线程中调用?更详细地说,我说的是Android (但我认为如果是Android还是纯Oracle Java,这是没有意义的)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-25 14:09:25

根据甲骨文文档的说法,

jint JNI_OnLoad(JavaVM *vm, void *reserved); 当加载本机库时,VM调用JNI_OnLoad (例如,通过System.loadLibrary)。..。

目前尚不清楚执行时应该选择什么样的线程策略。但也许在某个地方用更精确的方式来描述。

无论如何,至少在Android JNI_OnLoad()上,在控制权从System.load*()返回之前,同步调用。它发生在调用System.load*()的同一个线程中。以确保你能深入到

您还可以尝试使用它:在System.load*()之前和之后以及在JNI_OnLoad()内部添加日志,然后分析日志顺序ant线程ID。

最后很少有想法。按照规范,JNI_Onload()可以中止加载:

如果VM不识别JNI_OnLoad返回的版本号,则无法加载本机库。

因此,如果它返回的不是有效的JNI_VERSION_*常量- System.load*()必须失败。因此,JNI_ONload()必须在相应的System.load*()之前返回。在多线程环境中,这种行为可以通过两种方式实现:

  • 直接在JNI_ONLoad()内部运行System.load*()
  • 将其代理到其他线程并阻止System.load*(),直到它完成为止。

第二个问题似乎过于复杂和浪费。因此,第一种选择是唯一明确的选择。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40779502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档