我有一个使用 Android NDK 编写的 android 项目。在项目中,我使用了两个预构建的共享库(GpkgSDK 和 spatialite)并构建了另外两个共享库(WFSHelpers 和 com_example_gpkgviewer_jni_WKTConverter)。与应用程序的 Java 级别交互的唯一库是 com_example_gpkgviewer_jni_WKTConverter 库。
库之间的依赖关系如下图所示:
- 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_LIBRARY := 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
com_example_gpkgviewer_jni_WKTConverter.cpp 中导致此错误的代码行如下所示:
*id_arg = WKBGenericGeometry::readInt32(byte_order, &(bytes[4]), length - 4);
关于如何解决依赖关系的任何建议。