我的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()
或者这根本不可能?
答案 0 :(得分:1)
这里的真正问题是如何在内部类中定义JNI函数,并在C / C ++代码中设置适当的声明。我不知道该怎么做,也无法在网上找到任何关于此的内容。我宁愿将功能移动到另一个类(不是内部类),然后从AsyncTask中调用该函数。从技术上讲,如果你的AsyncTask不是内部类,你应该能够做到这一点。
答案 1 :(得分: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()
因为您不在本机代码中创建此线程。