2012-11-29 26 views
2

我在我的Android項目中有很多jni調用,像魅力一樣工作,但這個我只是無法正確:當試圖從Android中的AsyncTask調用jni函數時,我收到以下錯誤消息:Android:如何從AsyncTask調用ndk函數?

11-30 10:07:20.130: W/dalvikvm(16555): No implementation found for native Lcom/company/MainView$MyAsyncTask;.MyFunction (Ljava/lang/String;)Z 

當通常的JNI函數的聲明是這樣的:

JNIEXPORT jboolean JNICALL Java_com_company_MainView_myFunction()... 

如何將我從AscnyTask調用時聲明瞭嗎? 我沒有找到在谷歌的答案,我已經嘗試過失敗:

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使用env from threadid = 1 – user1628803

+0

即使我沒有使用_env_。 – user1628803

1

一般而言,您可以運行javah工具爲您在Java代碼中聲明的本機方法生成C/C++聲明。在特定情況下,

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

將產生如下標題:

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

關於線程問題的AsyncTask可以從不同的線程每次調用你的函數,但每次通話將提供正確env作爲第一個參數,並且您不需要AttachCurrentThread()因爲您不在您的本機代碼中創建此線程。