我有一個使用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);
任何建議我如何能解決依賴性。
您可能需要閱讀$ NDK/build/core/build-binary.mk的第一頁左右的說明 - 我的快速閱讀是隻有系統庫應列在LOCAL_LDLIBS –
@ChrisStratton :感謝您的回覆,請通過上述文件。 – kushaldsouza