2017-09-05 10 views
1

C에서 NativeActivity를 사용하고 있습니다. 내 목표는 더 많은 Android 호출을 할 수 있도록 JNIEnv에 대한 참조를 얻는 것입니다. 나는 안드로이드 문서와 유래에 수집 한 사례로가는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 포인터에 전달해야하기 때문에, 함수 서명도 다를 것이다.

이 시도 :

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

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

그것은 당신이 C++ C에서 전화 및되지 않은 것 같습니다. 이 경우 JNIInvokeInterface 포인터에 대한 JavaVM의 typedef가 있습니다. 여기

는 C 컴파일러를 사용하여 해당 유형 (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++ 컴파일러를 사용하는 예제는 struct 대신 typedef 될 것입니다.

C 사용법이 C + +와 약간 다릅니다.

+0

추가 참조가 작동하지만 그 사실을 알지 못했습니다. 감사! –