2

私の Android プロジェクトには魅力的な jni 呼び出しがたくさんありますが、これはうまくいきません。Android で AsyncTask から jni 関数を呼び出そうとすると、次のエラー メッセージが表示されます。

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 から呼び出すときにどのように宣言しますか? Googleで答えが見つからず、試してみましたが失敗しました:

JNIEXPORT jboolean JNICALL Java_com_company_MainView$MyAsyncTask_myFunction()

JNIEXPORT jboolean JNICALL Java_com_company_MainView_MyAsyncTask_myFunction()

それとも、これはまったく不可能ですか?

4

2 に答える 2

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()され、ネイティブコードでこのスレッドを作成しないため、必要ありません。

于 2012-12-02T11:02:48.660 に答える
1

ここでの本当の問題は、内部クラス内から JNI 関数を定義し、C/C++ コードで適切な宣言をセットアップする方法です。それを行う方法がわからず、これについてネット上で何も見つけることができませんでした。代わりに、機能を別のクラス (内部クラスではない) に移動し、AsyncTask からその関数を呼び出します。技術的には、AsyncTask が内部クラスでない場合、これを実行できるはずです。

于 2012-11-29T21:26:06.470 に答える