JNI_OnLoad()
是否始终在主线程或System.load()
/System.loadLibrary()
调用线程中调用?更详细地说,我正在谈论 Android(但我认为如果它是 Android 或纯 Oracle Java 就没有意义)。
根据 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*()
直到完成第二个似乎过于复杂和浪费。所以我认为第一个是唯一明确的选择。