Java JNI関数の登録プロセスの詳細な紹介
Javaでネイティブコードを呼び出すと、通常はJNIを通じて実装されます。 Javaクラスにローカル.soライブラリファイルをロードし、ネイティブメソッドを宣言してから、呼び出される必要がある場合に呼び出すだけです。 Javaのネイティブメソッドの特定の実装に関しては、すべてがネイティブ層に引き渡されます。 Javaのローカルコードの対応する機能を正しく呼び出す前提条件は何ですか?答えは、特定のメカニズムを通じて、Javaのネイティブメソッドとローカルコードの機能との間に1対1の対応を確立することです。では、このメカニズムは何ですか?これは、JNI関数の登録メカニズムです。
JNI関数を登録するには2つの方法があります。1つは静的登録方法、もう1つは動的登録方法です。以下にこれら2つの実装方法を紹介しましょう。
1。静的登録。
1。実装原則:関数名に基づいてJavaメソッドとJNI関数の間に1対1の対応を確立します。
2。実装プロセス:
writing Javaコード。
javaコードをコンパイルし、。クラスファイルを生成します。
havahディレクティブを使用して、生成された.classファイルを使用してJNI .hファイルを生成します。
huned生成されたJNIヘッダーファイルには、JNIレイヤーのJava関数の宣言が含まれています。
3。短所:
JNIレイヤー関数の名前は特定の形式に従う必要があり、名前は特に長いため、writingは非常に不便です。
JNIヘッダーファイルは、ネイティブ機能を宣言するすべてのJavaクラスに対して書かれている必要があるため、プログラマーに多くの作業を引き起こします。
cormingプログラムは非効率的です。なぜなら、ネイティブ関数を初めて呼び出すときは、関数名に従ってJNIレイヤーの対応するローカル関数を検索し、対応する関係を確立する必要があるためです。このプロセスは時間がかかります。
2。動的登録。
1。実装原則:JNIの対応する関数へのポインターをネイティブ関数に直接伝えます。
2。実装プロセス:
sturtion Jninativemethodの構造を使用して、Javaネイティブ機能とJNI関数の間の対応を保存します。
jninativemethodアレイで、すべてのネイティブ関数とJNI関数の間の対応を保存します。
system.LoadLibraryを介してJNIダイナミックライブラリをロードすると、JNI_ONLOAD関数を呼び出して動的登録を開始します。
AndroidRuntime :: RegisterNativeMethods関数は、関数登録のためにjni_onloadで呼び出されます。
Androidruntimeのjniregisternativemethodsへの最終呼び出し:: RegisterNativeMethods完全な登録。
3.利点:静的登録の欠点を克服します。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!