2016-11-24 18 views

答えて

2

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

ネイティブライブラリがロードされたときにVMがJNI_OnLoadを呼び出し( 例えば、System.loadLibraryを介して)。 ...

実装によってどのスレッドポリシーを選択するべきかは不明です。しかし、もっと正確な方法で記述されているかもしれません。

とにかく、少なくとも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*()より早く返さなければなりません。それは他のスレッドにSystem.load*()

  • プロキシの内部で直接

    • 実行JNI_ONLoad()をし、それが

    を終了するまで、2番目の1があるように思わSystem.load*()をブロック:マルチスレッド環境では、このような行動は、2つの方法で達成することができます過度の複雑さと無駄。だからIMO最初のものは唯一の明確な選択です。

  • 関連する問題