2017-01-25 14 views
0

Я пытаюсь создать статическую библиотеку, используя автономную toolchain для проекта, который имеет свой собственный процесс сборки, который затем обертываю библиотекой C++ и выставляю на Android (скомпилированный с помощью ndk-build). Однако на этапе NDK-сборки я получаю следующее сообщение об ошибке:Как разрешить «Перемещение в общем ELF» во время ndk-build?

➜ jni /Users/chrisfosterelli/Library/Android/sdk/ndk-bundle/ndk-build      
[arm64-v8a] Compile++  : wrapper <= wrapper.cpp 
In file included from /Users/chrisfosterelli/workspace/android/jni/wrapper.cpp:9: 
In file included from ../prebuild/include/valhalla/meili/universal_cost.h:7: 
In file included from ../prebuild/include/valhalla/sif/dynamiccost.h:4: 
In file included from ../prebuild/include/valhalla/baldr/directededge.h:5: 
../prebuild/include/valhalla/baldr/graphconstants.h:432:11: warning: 21 enumeration values not handled in switch: 'kRoad', 'kRamp', 'kTurnChannel'... [-Wswitch] 
    switch (use) { 
     ^
1 warning generated. 
[arm64-v8a] SharedLibrary : libwrapper.so 
/Users/chrisfosterelli/Library/Android/sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: /Users/chrisfosterelli/workspace/android/jni/../prebuild/libvalhalla_meili.a(libvalhalla_meili_la-map_matcher_factory.o): Relocations in generic ELF (EM: 62) 
[...above message repeated many times...] 
/Users/chrisfosterelli/workspace/android/jni/../prebuild/libvalhalla_meili.a: error adding symbols: File in wrong format 
clang++: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [/Users/chrisfosterelli/workspace/android/obj/local/arm64-v8a/libwrapper.so] Error 1 
➜ jni ls /Users/chrisfosterelli/Library/Android/sdk/ndk-bundle/ 

Эта ошибка указывает, насколько я могу сказать, что я пытаюсь смешивать и сочетать исполняемые файлы, скомпилированные для различных архитектур. Однако, от того, что я могу сказать библиотеку правильная архитектура:

[email protected]:/meili/meili2/newtest# ar x libvalhalla_meili.a 
[email protected]:/meili/meili2/newtest# file libvalhalla_meili_la-map_matcher_factory.o 
libvalhalla_meili_la-map_matcher_factory.o: ELF 64-bit LSB relocatable, ARM aarch64, version 1 (SYSV), not stripped 
[email protected]:/meili/meili2/newtest# 

FWIW, это мой текущий Application.mk,

APP_STL := c++_static 
APP_CPPFLAGS := -frtti -std=gnu++11 -D_GLIBCXX_USE_C99 
APP_CPPFLAGS += -fexceptions 
NDK_TOOLCHAIN_VERSION := clang 
APP_LDFLAGS := -latomic 
APP_PLATFORM := android-21 
APP_ABI := arm64-v8a 

и Android.mk,

LOCAL_PATH := $(call my-dir) 

# static library info 
include $(CLEAR_VARS) 
LOCAL_MODULE := libvalhalla_meili 
LOCAL_SRC_FILES := ../prebuild/libvalhalla_meili.a 
LOCAL_EXPORT_C_INCLUDES := ../prebuild/include 
include $(PREBUILT_STATIC_LIBRARY) 

# wrapper info 
include $(CLEAR_VARS) 
LOCAL_C_INCLUDES += ../prebuild/include 
LOCAL_MODULE := wrapper 
LOCAL_SRC_FILES := wrapper.cpp 
LOCAL_STATIC_LIBRARIES := libvalhalla_meili 
include $(BUILD_SHARED_LIBRARY) 

Любые идеи, как разрешить это? Я пробовал несколько вещей, но все они приводят к более (более неясным) ошибкам, поэтому я надеюсь, что кто-то здесь может указать мне в правильном направлении!

ответ

0

Я обнаружил проблему, но мне жаль, что у меня не было более глубокого ответа. По-видимому, процесс сборки создал два файла библиотеки. Тот, который я проверял, был, конечно, ARM64. Однако тот, который я на самом деле скопировал на устройство Android, был x86.

Итак, сообщение об ошибке было правильным, а также был файл библиотеки, но было задействовано более одного файла. Если вы столкнулись с одной и той же проблемой и достаточно уверены, что ваша библиотека ARM64, дважды проверьте, что это тот же самый файл, который скомпилирован в сборку ndk!