2014-03-19 70 views
3

我有一個使用Android NDK編寫的Android項目。在這個項目中,我使用了兩個預先構建的共享庫(GpkgSDK和Spatialite),並構建了兩個共享庫(WFSHelpers和com_example_gpkgviewer_jni_WKTConverter)。與應用程序的Java級別交互的唯一庫是com_example_gpkgviewer_jni_WKTConverter庫。依賴於另一個模塊的Android NDK模塊

庫之間的依賴關係如下所示:

  • WFSHelpers取決於GpkgSDK和spatialite
  • com_example_gpkgviewer_jni_WKTConverter取決於WFSHelpers

,我遇到的問題是,當我嘗試運行ndk-build,當嘗試構建com_example_gpkgviewer_jni_WKTConverter庫時,我得到很多未定義的引用。其他庫成功構建。我通常會解決這些未定義的引用的方式是通過在我com_example_gpkgviewer_jni_WKTConverter模塊定義如下:

LOCAL_SHARED_LIBRARY := WFSHelpers 

我不能確定是否我還需要包括該WFSHelpers依賴於像這樣的庫:

LOCAL_SHARED_LIBRARY := WFSHelpers GpkgSDK spatialite 

我也嘗試過不同的順序,像這樣,但它似乎並沒有解決我的問題:

  • LOCAL_SHARED_LIB郭寶宏:= GpkgSDK spatialite WFSHelpers

我Application.mk包含如下:

NDK_TOOLCHAIN_VERSION := 4.8 
# APP_STL := stlport_shared --> does not seem to contain C++11 features 
APP_STL := gnustl_shared 

# Enable c++11 extentions in source code 
APP_CPPFLAGS += -std=c++11 
APP_CPPFLAGS += -frtti 
APP_CPPFLAGS += -fexceptions 

APP_MODULES := GpkgSDK spatialite WFSHelpers com_example_gpkgviewer_jni_WKTConverter 

APP_ABI := armeabi armeabi-v7a 

我Android.mk如下所示:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := GpkgSDK 
LOCAL_SRC_FILES := libMP.so 
LOCAL_EXPORT_C_INCLUDES := \ 
$(LOCAL_PATH)/include \ 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := spatialite 
LOCAL_SRC_FILES := spatialamal/prebuilt/$(TARGET_ARCH_ABI)/libspatialite.so 
LOCAL_EXPORT_C_INCLUDES :=  spatialamal/headers/spatialite \ 
          spatialamal/headers 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := WFSHelpers 
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog 
LOCAL_SRC_FILES := \ 
GPKGReader/Debug.h \ 
GPKGReader/DLLExport.h \ 
GPKGReader/DBQueryResult.cpp \ 
GPKGReader/GeoPackageDB.cpp \ 
GPKGReader/GPKGReader.cpp \ 
GPKGReader/order32.h \ 
GPKGReader/SpecDefinitions.h \ 
GPKGReader/WKBGenericGeometry.cpp \ 
GPKGReader/WKBLineString.cpp \ 
GPKGReader/WKBMultiLineString.cpp \ 
GPKGReader/WKBMultiPolygon.cpp \ 
GPKGReader/WKBPoint.cpp \ 
GPKGReader/WKBPolygon.cpp \ 
GPKGDataLayer/GPKGDataLayer.cpp 
LOCAL_SHARED_LIBRARIES := GpkgSDK spatialite 
include $(BUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog 
LOCAL_MODULE := com_example_gpkgviewer_jni_WKTConverter 
LOCAL_SRC_FILES := com_example_gpkgviewer_jni_WKTConverter.cpp 
LOCAL_SHARED_LIBRARY := WFSHelpers GpkgSDK spatialite 
include $(BUILD_SHARED_LIBRARY) 

未定義引用錯誤的一個例子即我得到如下所示:

[armeabi] SharedLibrary : libcom_example_gpkgviewer_jni_WKTConverter.so 
jni/com_example_gpkgviewer_jni_WKTConverter.cpp:59: error: undefined reference 
o 'WKBGenericGeometry::readInt32(unsigned char, unsigned char*, unsigned int)' 
collect2.exe: error: ld returned 1 exit status 
make.exe: *** [obj/local/armeabi/libcom_example_gpkgviewer_jni_WKTConverter.so] 
Error 1 

該li內com_example_gpkgviewer_jni_WKTConverter.cpp導致該錯誤代碼NE如下所示:

*id_arg = WKBGenericGeometry::readInt32(byte_order, &(bytes[4]), length - 4); 

任何建議我如何能解決依賴性。

回答

4

試圖讓這個建立多年,我終於能夠得到它的工作。雖然我不太清楚這些差異是什麼,所以任何能夠說明這一點的人都歡迎這樣做。我的問題是我有依賴於其他庫。文檔狀態如下:

LOCAL_SHARED_LIBRARIES
共享庫模塊的這個 模塊在運行時間取決於列表。這在鏈接時是必要的,並且 將相應的信息嵌入到生成的文件中。

LOCAL_LDLIBS
構建共享庫或可執行文件時要使用的附加鏈接器標誌的列表。這對於傳遞具有'-l'前綴的特定系統庫的 名稱很有用。例如, 下面將告訴鏈接生成在加載時鏈接到 /system/lib/libz.so模塊:

LOCAL_LDLIBS := -lz 

見穩定的API就可以暴露系統庫列表與此NDK版本鏈接。
注意:對於靜態庫,這將被忽略,如果您在此模塊中定義它,則ndk-build將顯示一條警告。

因此,在我的Android.mk文件中,我必須使用LOCAL_LDLIBS而不是LOCAL_SHARED_LIBRARIES來指示依賴關係。

我的新Android.mk如下圖所示:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := GpkgSDK 
LOCAL_SRC_FILES := libMP.so 
LOCAL_EXPORT_C_INCLUDES := \ 
$(LOCAL_PATH)/include \ 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := spatialite 
LOCAL_SRC_FILES := spatialamal/prebuilt/$(TARGET_ARCH_ABI)/libspatialite.so 
LOCAL_EXPORT_C_INCLUDES :=  spatialamal/headers/spatialite \ 
          spatialamal/headers 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := WFSHelpers 
LOCAL_SRC_FILES := \ 
GPKGReader/Debug.h \ 
GPKGReader/DLLExport.h \ 
GPKGReader/DBQueryResult.cpp \ 
GPKGReader/GeoPackageDB.cpp \ 
GPKGReader/GPKGReader.cpp \ 
GPKGReader/order32.h \ 
GPKGReader/SpecDefinitions.h \ 
GPKGReader/WKBGenericGeometry.cpp \ 
GPKGReader/WKBLineString.cpp \ 
GPKGReader/WKBMultiLineString.cpp \ 
GPKGReader/WKBMultiPolygon.cpp \ 
GPKGReader/WKBPoint.cpp \ 
GPKGReader/WKBPolygon.cpp \ 
GPKGDataLayer/GPKGDataLayer.cpp 
LOCAL_LDLIBS := libs/$(TARGET_ARCH_ABI)/libGpkgSDK.so 
LOCAL_LDLIBS += libs/$(TARGET_ARCH_ABI)/libspatialite.so 
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog 
include $(BUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := com_example_gpkgviewer_jni_WKTConverter 
LOCAL_SRC_FILES := com_example_gpkgviewer_jni_WKTConverter.cpp 
LOCAL_LDLIBS := libs/$(TARGET_ARCH_ABI)/libWFSHelpers.so 
LOCAL_LDLIBS += libs/$(TARGET_ARCH_ABI)/libGpkgSDK.so 
include $(BUILD_SHARED_LIBRARY) 

,因爲我不能完全肯定LOCAL_LDLIBS和LOCAL_SHARED_LIBRARIES之間的區別是什麼,我要離開這個答案開一會兒。如果任何人都可以給我一個解釋,請做。如果沒有,我會在給它一段時間後將這個答案標記爲接受。謝謝 !

+0

您可能需要閱讀$ NDK/build/core/build-binary.mk的第一頁左右的說明 - 我的快速閱讀是隻有系統庫應列在LOCAL_LDLIBS –

+0

@ChrisStratton :感謝您的回覆,請通過上述文件。 – kushaldsouza

相關問題