Android:如何从AsyncTask调用call ndk函数?

时间:2012-11-29 21:14:58

标签: android-ndk android-asynctask

我的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()

或者这根本不可能?

2 个答案:

答案 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()因为您不在本机代码中创建此线程。