2017-09-05 14 views
1

私はCからNativeActivityを使用しています。 私の目標はJNIEnvへの参照を取得することです。私はAndroidのドキュメントとのStackOverflowの上に集まっている例で行くAndroid NativeActivity:AttachCurrentThread JNIInvokeInterfaceが構造体または共用体ではありません

、私はこの

state->activity->vm->AttachCurrentThread(&env, NULL);``` 

を見続けるしかし、私はこのエラーを得続ける...

error: member reference base type 'JavaVM' (aka 'const struct JNIInvokeInterface *') is not a structure or union 

答えて

1

あなたは間接参照する必要があり、あなたの"JavaVMポインタへのポインタ"。

これは動作します:あなたがCを使用しているので

(*state->activity->vm)->AttachCurrentThread(...); 

あなたはまたのJavaVMへのポインタを渡す必要があるため、関数のシグネチャも異なるだろう。

はこれを試してください:あなたがC、およびないC++から呼び出しているよう

JavaVM *vm = state->activity->vm; 

(*vm)->AttachCurrentThread(vm, &env, NULL); 

に見えます。 この場合、JNIInvokeInterfaceポインターへのJavaVMのtypedefがあります。

ここでは、そのタイプのヘッダーの定義(jni.h中)Cコンパイラを使用して

struct _JavaVM; 
typedef const struct JNINativeInterface* C_JNIEnv; 

#if defined(__cplusplus) 
typedef _JNIEnv JNIEnv; 
typedef _JavaVM JavaVM; 
#else 
typedef const struct JNINativeInterface* JNIEnv; 
typedef const struct JNIInvokeInterface* JavaVM; 
#endif 

だ、あなたはあなたの説明エラーの原因となっているポインタへのポインタで関数を呼び出している:「ではない構造または組合 "と呼ばれる。

しかし、あなたの使用例はC++コンパイラのためのもので、ヘッダー定義でわかるように、代わりにstructにtypedefされています。

Cの使用法はC++とは少し異なります

+0

余分な逆参照は機能しますが、私はそれに気付きませんでした。ありがとう! –

関連する問題