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

问题描述 投票:0回答:1

JNI_OnLoad()
是否始终在主线程或
System.load()
/
System.loadLibrary()
调用线程中调用?更详细地说,我正在谈论 Android(但我认为如果它是 Android 或纯 Oracle Java 就没有意义)。

java android multithreading java-native-interface
1个回答
5
投票

根据 Oracle 文档

jint JNI_OnLoad(JavaVM *vm, void *reserved);

加载本机库时,VM 调用 JNI_OnLoad(例如 例如,通过 System.loadLibrary)。 ...

尚不清楚实现时应选择什么线程策略。但也许在某个地方以更精确的方式描述了它。

无论如何,至少在 Android 上,在控制从

JNI_OnLoad()
返回之前同步调用
System.load*()
。它发生在调用
System.load*()
的同一线程中。确保您可以深入了解

您也可以尝试尝试一下:在

System.load*()
前后和
JNI_OnLoad()
内部添加日志,然后分析日志顺序蚂蚁线程ID。

最后没什么想法。根据规范

JNI_Onload()
可能会中止加载:

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

因此,如果它返回有效

JNI_VERSION_*
常量以外的内容 -
System.load*()
一定会失败。因此,
JNI_ONload()
必须比相应的
System.load*()
更早返回。在多线程环境中,这种行为可以通过两种方式实现:

  • 直接在
    JNI_ONLoad()
     内部运行 
    System.load*()
  • 将其代理给其他线程并阻塞
    System.load*()
    直到完成

第二个似乎过于复杂和浪费。所以我认为第一个是唯一明确的选择。

© www.soinside.com 2019 - 2024. All rights reserved.