2013-08-18 5 views
2

JNI를 사용하여 Android에서 Qt로 음악 라이브러리를 가져오고 있습니다. 나는 Android JNI/NDK 애플리케이션 컨텍스트

public String getArtists(Context context) 
... 

나는 그것이 작동하기 위해서는 응용 프로그램의 컨텍스트를 얻을 수 있어야합니다 (이미 구현) 다음과 같은 Java 메소드에 호출합니다.

Java를 사용할 때 다음 코드가 올바른 컨텍스트를 제공합니다.

MainActivity.this 

이 문제에 도움이 될만한 사람이 있습니까?

감사합니다.

+0

시도한 jni 코드를 표시 할 수 있습니까? – krsteeve

+0

물론입니다! http://pastebin.com/Kqjq3NWs 이것은 오류없이 실행됩니다. – Jacob

답변

2

전화가 걸려 오는 곳에 따라 다릅니다. 이상적으로 C++로 MainActivity 포인터를 캐시 할 것입니다.

나중에 JNI 호출에서 사용할 포인터를 캐싱하는 한 가지 방법은 native void onCreateNative()과 같은 Java에서 네이티브 함수를 MainActivity 클래스에 추가하는 것입니다. 이제

JNIEXPORT void JNICALL com_package_MainActivity_onCreateNative(JNIEnv *env, jobject thiz) 
{ 
    gCachedActivity = env->NewGlobalRef(thiz); 
} 

당신이 gCachedActivity을 사용할 수 있습니다 당신은 물론 MainActivity.this

env->CallObjectMethod(obj, s_getArtistsGetArtistsMethodID, gCachedActivity); 

은 당신이 개체와 obj를 교체 사용했을 : C++에서 당신은 "thiz"포인터를하는 방법을 구현하고 캐시합니다 메소드 호출.

마지막으로 onCreateNative()onCreate() 메서드에서 MainActivity으로 호출해야합니다.

+0

이해할 수 있는지 잘 모르겠습니다. MainActivity.java에 해당하는 함수를 추가해야합니까? – Jacob

+0

이것은 단지 한 가지 방법 일뿐입니다. 그렇습니다. MainActivity 클래스에 onCreateNative()를 추가하십시오. – krsteeve

+0

네이티브 메소드 인'onCreateNative (this)'를 ** MainActivity ** 콜백의 onCreate() 콜백으로 호출해야합니다 수업. –

관련 문제