2012-10-29 80 views
1

我已經堅持了幾個星期了。使用本機庫時出現Android UnsatisfiedLinkError

我一直在Android的BT客戶端使用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 
+1

三重檢查拼寫的完整包名Java_com_my_package_LibTorrent_MagnetToTorrent在.H和.cpp –

+0

@AndrewG感謝兩個,但我已經檢查了它很多時候,我失去了計數。我認爲我現在應該看到它了,所以我懷疑是這種情況 – Gabriel

回答

0

我終於明白出了什麼問題。我不得不將此行添加到jni/Application.mk

APP_ABI := armeabi armeabi-v7a 

這將導致本地代碼要還內置了對ARMv7處理器,這是我對我的新手機。

所有其他答案也應該對其他有類似問題的開發者有用。我爲他們每個人標記了+1。對於可能會導致應用程序拋出UnsatisfiedLinkError等問題,這個環節可能會有所幫助:http://developer.android.com/guide/practices/jni.html#faq_ULE

2

你已經忘記了extern "C"任何機會呢?

+0

不能,extern「C」在頭文件中。請參閱我的帖子的編輯 – Gabriel

1

我看到的唯一原因是您的本地庫沒有符號。自從上次庫更改(您聲稱爲您工作)後,是不是偶然更改了構建路徑和/或構建的其他方面?在Java構建不知道的其他地方是不是「更新」的庫?找到您的庫文件(.so?)並檢查它是否有導出的符號(dumpbin,objdump,nm,因平臺而異)。確保它是真正的Java構建加載的一個庫。

相關問題