是否始终在主线程或JNI_OnLoad()
/ System.load()
调用线程中调用System.loadLibrary()
?更详细的是我在谈论Android(但我认为如果它是Android或纯Java Java则没有意义。)
答案 0 :(得分:3)
根据Oracle docs,
jint JNI_OnLoad(JavaVM *vm, void *reserved);
VM加载本机库时调用JNI_OnLoad(for 例如,通过System.loadLibrary)。 ...
目前尚不清楚应该通过实施选择什么线程政策。但也许某个地方会以更精确的方式描述。
无论如何,在控制从JNI_OnLoad()
返回之前,至少在Android 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*()
直到完成第二个似乎过于复杂和浪费。所以IMO第一个是唯一明确的选择。