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 调用时我将如何声明它?我在谷歌上没有找到答案,我没有成功尝试过:

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 回答