2015-06-29 70 views
0

我正在使用本機庫與我的Android Studio項目。我正在嘗試使用net-snmp,它是一個C庫(不幸的是,這是一個必備項目,我不能使用替代品,因爲有一個更大的本地庫依賴於此)。我們已經將這些文件編譯成.so文件,並且正確地完成了這些工作(據我所知,無論如何編譯都沒有錯誤)。Android NDK中的頭文件的未定義符號錯誤

但是,每當試圖加載這些庫,我得到以下錯誤:java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "endgrent" referenced by "libnetsnmp.so"...

此功能是grp.h包含在Android的NDK的每一個版本。這裏是Android.mk文件的relavent部分:

include $(CLEAR_VARS) 
LOCAL_MODULE := NetSNMP 
LOCAL_SRC_FILES := net-snmp/libnetsnmp.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/net-snmp/include 
include $(PREBUILT_SHARED_LIBRARY) 

我有點新NDK,但我發現了一個未定義符號錯誤通常是指它是無法找到相應的文件夾。據我所知,這應該由Android NDK引入。我在這裏做錯了什麼?這只是一些與makefile無關的錯誤?

更新:即使在嘗試將grp.h文件移至包含的include之後,仍然會發現相同的錯誤。

回答

0

所以我很確定我明白了這一點,如果別人碰巧有這個問題。由於某種原因,這個文件根本就不存在。幸運的是,這是一條替代路線(如果存在,請改爲)。但是,NDK不理解include是否包含(但編譯器確實沒有,因此它沒有放入庫中)。

所以它搜索了grp.h,即使它沒有被包含。所以它墜毀了。刪除它,它修復了錯誤。但是,對於冒險踏上這條道路的任何人,我們開始遇到版本號的問題(它正在崩潰,因爲它試圖找到'foo.so.#')。如果你在makefile中編譯版本並重新編譯,這也應該解決這個問題。在未來的NDK或Android版本中,可能會有版本號的修正,但是沒有寫這個。所以擺脫版本號是你現在最好的路線。