2012-11-29 2 views
2

나는 Android 프로젝트에서 매력처럼 작동하지만 jni 함수를 많이 사용합니다. Android에서 AsyncTask에서 jni 함수를 호출 할 때이 오류 메시지가 나타납니다.Android : AsyncTask에서 ndk 함수를 호출하는 법?

JNI 함수 선언은 다음과 같이 작동 할 때 일반적으로
11-30 10:07:20.130: W/dalvikvm(16555): No implementation found for native Lcom/company/MainView$MyAsyncTask;.MyFunction (Ljava/lang/String;)Z 

일 : AscnyTask에서 호출 할 때

JNIEXPORT jboolean JNICALL Java_com_company_MainView_myFunction()... 

어떻게 그것을 선언 할 것인가? 내가 구글에 대한 답을 찾을 수 없습니다 내가 실패 시도 :

JNIEXPORT jboolean JNICALL Java_com_company_MainView_MyAsyncTask_myFunction() 

JNIEXPORT jboolean JNICALL Java_com_company_MainView$MyAsyncTask_myFunction() 

와 또는이 전혀 불가능하다?

+0

이 문제에 대한 해결책을 찾았습니까? –

답변

1

여기 실제 문제는 내부 클래스 내에서 JNI 함수를 정의하고 C/C++ 코드에서 적절한 선언을 설정하는 방법입니다. 나는 그 일을하는 법을 알지 못했고 이것에 관해서 그물을 찾을 수 없었다. 그 대신 기능을 다른 클래스 (내부 클래스가 아님)로 옮긴 다음 AsyncTask에서 해당 함수를 호출합니다. 기술적으로 AsyncTask가 내부 클래스가 아닌 경우이 작업을 수행 할 수 있어야합니다.

+0

빠른 답변을 보내 주셔서 감사합니다. 나는 그것을 시도하고 그것이 다른 스레드 ID에서 지금 오는 충돌 및 다음 제외하고 작동 제외 : – user1628803

+0

11-30 11 : 46 : 31.985 : W/dalvikvm (20386) : JNI 경고 : threadid = 13 threadid에서 env 사용 = 1 – user1628803

+0

같은 _env_를 사용하지 않더라도. – user1628803

1

일반적으로 javah 도구를 실행하여 Java 코드에서 선언 한 원시 메소드에 대한 C/C++ 선언을 생성 할 수 있습니다. 스레딩 문제, AsyncTask를 다른 스레드에서 때마다 당신의 함수를 호출 할 수 있지만 때마다 호출이를 제공에 관한

JNIEXPPORT jboolean JNICALL Java_com_company_MainView_00024MyAsyncTask_MyFunction(JNIRnv *, jobject, jstring); 

: 특정 경우에,

javah -classpath bin/classes com/company/MainView$MyAsyncTask 

다음과 같은 헤더를 생성합니다 첫 번째 매개 변수로 env을 수정하고 네이티브 코드에이 스레드를 만들지 않으므로 AttachCurrentThread()이 필요하지 않습니다.