1

我已经坚持了好几个星期了。

我一直在 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
4

3 回答 3

1

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

于 2012-10-30T09:13:17.500 回答
1

你有什么机会忘记了extern "C"吗?

于 2012-10-29T20:49:46.433 回答
0

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

APP_ABI := armeabi armeabi-v7a

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

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

于 2012-11-06T12:55:35.010 回答