android — Как разрешить & quot; Перемещения в общем ELF & quot; во время ндк-билда?

Я пытаюсь собрать статическую библиотеку, используя отдельный набор инструментов для проекта, который имеет собственный процесс сборки, который затем оборачиваю библиотекой C ++ и открываю для Android (скомпилированной с помощью ndk-build). Однако на этапе 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/

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

root@eacbdb1c0e46:/meili/meili2/newtest# ar x libvalhalla_meili.a
root@eacbdb1c0e46:/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
root@eacbdb1c0e46:/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!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]