使用本机库时Android UnsatisfiedLinkError

时间:2012-10-29 20:21:54

标签: android java-native-interface unsatisfiedlinkerror

我已经被困在这几周了。

我一直在Android torrent客户端中使用libtorrent。最近,我想添加新功能,例如磁力链接。

所有原生函数都在PROJECT_FOLDER/jni/libtorrent.h中声明,并在PROJECT_FOLDER/jni/libtorrent.cpp中实现。

到目前为止,没有出错,但最近,我在libtorrent.h中添加了这个新功能:

JNIEXPORT jstring JNICALL Java_com_my_package_LibTorrent_MagnetToTorrent
(JNIEnv *env, jobject obj, jstring MagnetLink, jstring TorrentFolder);

我在libtorrent.cpp

中添加了它的实现
JNIEXPORT jstring JNICALL Java_com_my_package_LibTorrent_MagnetToTorrent
(JNIEnv *env, jobject obj, jstring MagnetLink, jstring TorrentFolder) {
        //function code here
}

我在代码上运行了ndk-build,并进行了编译。

com.my.package.LibTorrent类中,我添加了以下声明,与之前声明的其他本机方法相同,工作正常:

public native String MagnetToTorrent(String MagnetLink, String TorrentFolder);

但每当我打电话给我时,我都会UnsatisfiedLinkError: MagnetToTorrent。这真的很奇怪,因为之前我添加了原生函数,并且它们工作正常。

非常感谢任何帮助。谢谢。

编辑: libtorrent.h中声明的所有函数都被extern "C" {}包围,如下所示:

#ifdef __cplusplus
extern "C" {
#endif
/*Function declarations*/
#ifdef __cplusplus
}
#endif

3 个答案:

答案 0 :(得分:2)

你有忘记遗忘extern "C"吗?

答案 1 :(得分:1)

我看到的唯一原因是您的本地库没有符号。自上次更改库(您声称为您工作)以来,您是不是偶然更改了构建路径和/或构建的其他方面?是不是在你的Java构建不知道的其他地方构建了“更新”的库?找到您的库文件(.so?)并检查它是否有导出的符号(dumpbin,objdump,nm,每个平台不同)。确保它确实是您的Java构建正在加载的一个库。

答案 2 :(得分:0)

我终于弄清楚出了什么问题。我必须将此行添加到jni/Application.mk

APP_ABI := armeabi armeabi-v7a

这导致本机代码也是为ARMv7处理器构建的,这就是我在新手机上的内容。

所有其他答案对于有类似问题的其他开发人员也应该有用。我为每个人标记了+1。对于可能导致应用投放UnsatisfiedLinkError的其他问题,此链接可能会有所帮助:http://developer.android.com/guide/practices/jni.html#faq_ULE