Android NDK를 사용하여 작성된 Android 프로젝트가 있습니다. 프로젝트 내에서 두 개의 미리 만들어진 공유 라이브러리 (GpkgSDK 및 spatialite)를 사용하고 두 개의 공유 라이브러리 (WFSHelpers 및 com_example_gpkgviewer_jni_WKTConverter)를 추가로 작성합니다. 응용 프로그램의 Java 레벨과 상호 작용하는 유일한 라이브러리는 com_example_gpkgviewer_jni_WKTConverter 라이브러리입니다. 라이브러리 사이다른 모듈에 종속 된 Android NDK 모듈
종속성은 다음과 같습니다
- WFSHelpers을
- com_example_gpkgviewer_jni_WKTConverter 내가 데 문제가 WFSHelpers
에 의존 GpkgSDK에 의존하고 spatialite 될 때 I ndk-build를 실행하려고하면 com_example_gpkgviewer_jni_WKTConverter 라이브러리를 빌드 할 때 정의되지 않은 참조가 많이 발생합니다. 다른 라이브러리가 성공적으로 빌드됩니다.
LOCAL_SHARED_LIBRARY := WFSHelpers
나는 또한 WFSHelpers 그래서 등에 의존하는 라이브러리를 포함해야하는지에 확실하지 오전 : 나는 일반적으로 이러한 정의되지 않은 참조를 해결 할 방법은 내 com_example_gpkgviewer_jni_WKTConverter 모듈 정의에 다음과 같은 것입니다 :
LOCAL_SHARED_LIBRARY := WFSHelpers GpkgSDK spatialite
I는 또한 같은 다른 순서로 시도했지만 내 문제를 해결하지 않는 것
:
- LOCAL_SHARED_LIB을 RARY = 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 내가 종속성을 해결할 수있는 방법에
*id_arg = WKBGenericGeometry::readInt32(byte_order, &(bytes[4]), length - 4);
어떤 제안이 오류가 발생 com_example_gpkgviewer_jni_WKTConverter.cpp 내 코드의 네브라스카는 다음과 같습니다.
이 말은 $ NDK/build/core/build-binary.mk의 첫 번째 페이지에있는 주석을 읽을 수 있습니다. 빠른 읽기는 LOCAL_LDLIBS에 나열된 시스템 라이브러리 만 사용하는 것입니다. –
@ChrisStratton 답장을 보내 주셔서 감사합니다. 위의 파일을 검토해야합니다. – kushaldsouza