我已经被困在这几周了。
我一直在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
答案 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