1

「C」経由でアクセスするためのコードサンプルでは、​​env ポインターは次のように使用されます。

const char *str = (*env)->GetStringUTFChars(env, s, 0);

C++ の場合、サンプルは同じ呼び出しを行います。

const char *str = env->GetStringUTFChars(s, 0); 

ドキュメントは次のように続けています。

C++ では、余分なレベルの間接化とインターフェイス ポインター引数がソース コードから消えます。ただし、基本的なメカニズムは C とまったく同じです。C++ では、JNI 関数は C の対応する関数に展開されるインライン メンバー関数として定義されます。

そのステートメントは、C++ バージョンが最終的に C バージョンに拡張され、同じレベルの間接性を持つことを意味しますか?

ヘッダーファイルは見ていませんが、困惑しています。誰かがこの違いを説明できますか?

4

3 に答える 3

4

質問で引用された説明はそれを説明しています。C ++はインラインメンバー関数などをサポートしていますが、Cはサポートしていません。のC++定義にJNIEnvは、C定義にはない関数定義が含まれています。C++の定義は次のようになります。

char const* JNIEnv::GetStringUTFChars(jstring s, jint i)
{
  return (*this)->GetStringUTFChars(this, s, i);
}

Cバージョンで呼び出される関数は、実際には関数ポインターです。基本的に、aJNIEnv*はvptrであり、JNIが提供する多数の関数ポインターを持つ構造体を指します。C ++は、関数呼び出しJNIEnvのパラメーターを繰り返さなくても済むように、便宜上、追加の定義を直接提供します。this

于 2013-01-17T22:59:36.387 に答える
3

彼らがそれをどのように実装したかを正確に確認していませんが、次のようになっていると確信しています。

  • C++ では、JNIEnv* はメソッドの「this」になり、メソッドが env ポインターも使用できるようになります
  • C では、関数 (構造体の関数ポインターが指している) がそれを使用できる唯一の方法は、誰かがそれを引数として渡す場合です。
于 2013-01-17T22:55:43.207 に答える
1

したがって、OpenJDK のソースを見ると、jni.h のヘッダーに次のように記述されています。

770 /*
771  * We use inlined functions for C++ so that programmers can write:
772  *
773  *    env->FindClass("java/lang/String")
774  *
775  * in C++ rather than:
776  *
777  *    (*env)->FindClass(env, "java/lang/String")
778  *
779  * in C.
780  */
781 
782 struct JNIEnv_ {
783     const struct JNINativeInterface_ *functions;
784 #ifdef __cplusplus
785 
786     jint GetVersion() {
787         return functions->GetVersion(this);
788     }

これを明確にしてくれてありがとう。

于 2013-01-18T00:21:21.157 に答える