2017-09-05 77 views
1

我使用的是來自C的NativeActivity。我的目標是獲得對JNIEnv的引用,以便我可以進一步進行Android調用。Android NativeActivity:AttachCurrentThread JNIInvokeInterface不是一個結構或聯盟

由我都聚集在Android文檔和#2的例子中去,我總是看到這個

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

但我不斷收到這個錯誤...

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

回答

1

您需要取消引用您的「指向JavaVM指針的指針」。

這將工作:

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

由於您使用C,函數簽名也將是不同的,因爲你還需要傳遞一個指針的JavaVM。

試試這個:

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

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

看起來你是從C調用,而不是C++。 在這種情況下,JavaVM對JNIInvokeInterface指針有一個typedef。

下面是該類型(jni.h)的頭定義

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編譯器,你調用一個函數指針的指針,這是造成你的描述錯誤:「不是結構或一個工會「。

但是你使用的例子是用於C++編譯器的,正如你在頭文件定義中看到的那樣,它是用typedef來代替結構體的。

的C用法中有一點不同,C++

+0

額外的解引用作品中,我沒有注意到。謝謝! –