2011-05-23 54 views
5

我使用android-ndk编译了我的c源文件,然后将.so文件放在我的android项目的libs文件夹中,但是当我调用本机函数时,我有一个“没有找到本机的实现”错误。 如果我尝试从adb shell中调用这个函数,一切正常,所以我不明白为什么会出现这个错误。 请帮忙, Andrea未找到本机实现

回答

14

有一个确切的命名方案涉及JNI,这不是很明显。也许你的功能实现不符合它?例如,如果您希望能够从您的JAVA代码中调用一个名为startServer的本机函数,假设您的包名为com.example.something,并且您的类名为MyClass,那么您应该在您的函数中有一个成员函数JAVA类,像这样:

private native void startServer(); 

然后你的JNI的实现应该是这样的:

JNIEXPORT void Java_com_example_something_MyClass_startServer(JNIEnv *env, jobject obj) { 

// Do something here... 

} 

否则,有一个链接错误。

+0

我的软件包是:package upmt.os;和函数:public static native String upmtconf(String [] param);在Module类中。在c代码中,实现是JNIEXPORT jstring JNICALL Java_upmt_os_Module_upmtconf(JNIEnv * env,jobject obj,jobjectArray param) – 2011-05-23 11:49:01

+0

发布logcat输出以调用您的函数 - 它具有链接器正在查找的确切名称。如果你有某种错字,这是一个很好的方法来捕捉它。 – gby 2011-05-23 13:34:20

+0

我解决了它。这只是一个定义的makefile中的错误。无论如何感谢 – 2011-05-24 09:17:10

12

你可以得到这个还有一个原因,就是如果当时没有叫你的图书馆,你正在一个JNI函数调用:

static { 
    System.loadLibrary("myJNIFILE"); 
} 

应地方实际参照JNI函数之前被调用。

+0

你是完全正确的!我有一个可以正常工作的应用程序,但我添加了额外的初始屏幕(视图)和应用程序崩溃(我有一个JNI警告,抱怨找不到“本机”方法)。最后我移动了电话号码:\t static { \t \t System.loadLibrary(“mylibrary”); \t}负责启动应用程序的活动。 – Genar 2014-07-24 10:57:49

相关问题