1

検索しましたが、この「問題」に対する答えが見つかりませんでした。基本的に、通常、jni 関数にアクセスするには jni.h ヘッダーを含める必要がありますが、ヘッダーには主に関数プロトタイプと構造体宣言が含まれているため、関数を解決するためのソースを含めるか、静的ライブラリまたは動的ライブラリを含めます (これまでに見つかったものはありません)。 ) リンカが関数プロトタイプ宣言を解決できるようにします。

これまでのところ、Android NDK を使用してネイティブ ライブラリを構築し、jni.h ヘッダーをインクルードして jni 関数を使用するだけでしたが、Oracle のドキュメントと例でさえ、jni.h ヘッダーをインクルードし、インクルード ディレクトリを指定するだけです。では、コンパイラはどのように実装を見つけますか?

4

1 に答える 1

0

コンパイラはどのように実装を見つけますか?

コンパイラは実装を見つける必要はありません。JVMはそれらが動的にどこにあるかを教えてくれます。

JNIEnv構造体のtypedefですJNIEnv_。その構造体には、const struct JNINativeInterface_*呼び出されたfunctions多くのメソッドが含まれています。JNIのドキュメントを見ると、ほとんどのメソッドJNIEnv*の最初の引数がaであることがわかりますがenv->method(...)、引数なしで、を使用して呼び出しJNIEnv*ます。ドキュメントのメソッドは実際のメソッドであり、それらへのポインタはにありfunctionsますJNIEnv_。のメソッドはJNIEnv_、のメソッドポインタを呼び出すだけのラッパーですfunctionsJNIEnv_JVMがと対応するを作成するときはいつでも、JVMJNINativeInterface_はすべてのメソッドアドレスを動的に書き込みます。

于 2012-09-08T09:38:20.297 に答える