Как собрать библиотеку с одинаковым именем MODULE для разных ABI из разных исходных файлов в ndk?

В ndk я хочу собрать библиотеку с тем же именем MODULE для разных ABI из другого исходного файла.

У меня есть два источника под dir: armeabi-v7a и arm64-v8a

Вот мой Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := session
LOCAL_SRC_FILES := armeabi-v7a/libsession.so
TARGET_ARCH_ABI := armeabi-v7a
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := session
LOCAL_SRC_FILES := arm64-v8a/libsession.so
TARGET_ARCH_ABI := arm64-v8a
include $(PREBUILT_SHARED_LIBRARY)

Вот мой Application.mk:

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a arm64-v8a
APP_PLATFORM := android-21

но терпит неудачу:
Android NDK: Попытка определить локальный модуль 'session' в jni/Android.mk.
Android NDK: Но этот модуль уже был определен jni/Android.mk.

Как этого добиться?

1 ответ

Решение

Простейшим способом было бы использовать тот факт, что ваш файл.so, кажется, находится в подкаталогах, названных в честь ABI:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := session
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libsession.so
include $(PREBUILT_SHARED_LIBRARY)

Если бы это было не так, вы могли бы проверить значение TARGET_ARCH_ABI и действовал соответственно. Например:

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_SRC_FILES := foo/libfoo.so
else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
LOCAL_SRC_FILES := bar/libbar.so
endif

Там нет необходимости устанавливать TARGET_ARCH_ABI сами - это установлено для вас системой сборки.

Другие вопросы по тегам