2014-03-19 4 views
3

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 내 코드의 네브라스카는 다음과 같습니다.

답변

4

나이가 들어감을 얻으려고 시도한 후에 마침내 제대로 작동 할 수있게되었습니다. 비록 차이점이 무엇인지는 잘 모르겠으므로, 이것에 관해 밝혀 줄 수있는 사람은 누구나 환영합니다. 내 문제는 내가 다른 라이브러리에 의존했다는 것이었다.

LOCAL_SHARED_LIBRARIES
이 모듈은 런타임에 의존하는 공유 라이브러리 모듈의 목록 : 문서는 다음 상태. 이는 링크시 필수이며 에 해당 정보를 생성 된 파일에 포함시킵니다.

LOCAL_LDLIBS
공유 라이브러리 또는 실행 파일을 빌드 할 때 사용할 추가 링커 플래그 목록입니다. 이것은 특정 시스템 라이브러리의 이름 앞에 '-l'접두사를 사용하면 유용합니다.

LOCAL_LDLIBS := -lz 

은 당신이 할 수있는 노출 시스템 라이브러리의 목록 STABLE-API를 참조하십시오 : 예를 들어, 다음은로드시 /system/lib/libz.so로 연결되는 모듈을 생성하기 위해 링커를 말할 것이다 이 NDK 릴리스와 연결된
참고 : 정적 라이브러리에서는 무시되며, 모듈에 정의 된 경우 ndk-build에서 경고를 출력합니다.

따라서 Android.mk 파일에서 LOCAL_SHARED_LIBRARIES 대신 LOCAL_LDLIBS를 사용하여 종속성을 표시해야했습니다.

나의 새로운 Android.mk

은 다음과 같습니다 : 나는 LOCAL_LDLIBS과 LOCAL_SHARED_LIBRARIES의 차이가 무엇인지 전혀 모르겠습니다으로

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) 

내가 잠시 동안 열린이 답변을 떠날 것이다. 누구든지 내게 설명을 해줄 수 있다면 제발 해줘. 그렇지 않다면 나는이 대답을 받아 들인 채로 시간을 들여 표시 할 것입니다. 감사 !

+0

이 말은 $ NDK/build/core/build-binary.mk의 첫 번째 페이지에있는 주석을 읽을 수 있습니다. 빠른 읽기는 LOCAL_LDLIBS에 나열된 시스템 라이브러리 만 사용하는 것입니다. –

+0

@ChrisStratton 답장을 보내 주셔서 감사합니다. 위의 파일을 검토해야합니다. – kushaldsouza