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

时间:2016-11-24 06:35:47

标签: java android multithreading java-native-interface

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

1 个答案:

答案 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第一个是唯一明确的选择。