2012-01-20 3 views
0

このコードはhttp://java.sun.com/docs/books/jni/html/objtypes.html#4013JNIでC++を呼び出すJava:なぜJNIEnvポインタが2回間参照解除されるのですか?

JNIEXPORT jstring JNICALL 
Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt) 
{ 
    char buf[128]; 
    const jbyte *str; 
    str = (*env)->GetStringUTFChars(env, prompt, NULL); 
    if (str == NULL) { 
     return NULL; /* OutOfMemoryError already thrown */ 
    } 
    printf("%s", str); 
    (*env)->ReleaseStringUTFChars(env, prompt, str); 
    /* We assume here that the user does not type more than 
    * 127 characters */ 
    scanf("%s", buf); 
    return (*env)->NewStringUTF(env, buf); 
} 

から直接コピーされるのはなぜそれでもない

env->GetStringUTFChars(... 

(*env).GetStringUTFChars(... 

答えて

1

、あなたの質問にリンクされたドキュメントでearlierから:最初のパラメータ、JNIEnvのインタフェースポインタは、これを読んで関数テーブルへのポインタが含まれていた場所に

ポイント

JNIEnvそれ自身がポインタであるようです。これは段落の下の関係を説明する素敵な絵です。

+0

'JNIEnv'は、javaの悪名高い' jni.h'ヘッダファイルで定義されているポインタではなく、構造体です。この関数はプログラマが 'env-> GetStringUTFChars(...')を書くことを可能にするためにインライン化されています。 – Robino

関連する問題