NDK: как включить сборную общую библиотеку независимо от архитектуры
Я работаю над портированием Box2D, чтобы узнать немного больше о переносе android.
Я могу получить компиляцию проекта, и я вижу следующее....
ls libs/
armeabi armeabi-v7a
Теперь я хочу сделать что-то вроде этого, но я не знаю, как сделать его достаточно умным, чтобы выбрать arch (скажем, я хотел добавить x86). Как включить .so без жесткого кодирования пути .so в spec arch?
Ответы
Ответ 1
Это сработало...
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := box2D-prebuilt
LOCAL_SRC_FILES := ../Box2D/libs/$(TARGET_ARCH_ABI)/libbox2D.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/..
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := box2DHello
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/*.cpp))
LOCAL_LDLIBS := -lm -llog
LOCAL_SHARED_LIBRARIES := box2D-prebuilt
include $(BUILD_SHARED_LIBRARY)
Ответ 2
Просто определите, какие архитектуры вы хотели бы поддерживать в android.mk и Application.mk, как описано в документации NDK (APPLICATION-MK.html и PREBUILTS.html):
V. ABI Выбор готовых двоичных файлов:
Как было сказано ранее, очень важно предоставить предварительно собранную общую библиотеку который совместим с целевым ABI во время сборки. Чтобы сделать это, проверьте значение TARGET_ARCH_ABI, его значение будет:
armeabi = > при настройке ARMv5TE или выше процессоров armeabi-v7a = > при таргетинге на ARMv7 или более высокие CPU x86 = > при таргетинге на процессоры x86 mips = > при таргетинге на CPU MIPS
Обратите внимание, что системы armeabi-v7a могут просто запускать двоичные файлы armeabi.
Вот пример, где мы предоставляем две версии предварительно построенной библиотеки и выберите, какой из них следует копировать на основе целевого ABI:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
Здесь. мы предполагаем, что готовые библиотеки для копирования находятся под следующая иерархия каталогов:
Android.mk --> the file above
armeabi/libfoo.so --> the armeabi prebuilt shared library
armeabi-v7a/libfoo.so --> the armeabi-v7a prebuilt shared library
include/foo.h --> the exported header file
ПРИМЕЧАНИЕ. Помните, что вам не нужно предусматривать заранее созданный armeabi-v7a библиотеки, так как армейцы можно легко запустить на соответствующем устройства.
Ответ 3
libmath-prebuilt.so - это предварительно построенная библиотека, которая имеет некоторые функции, которые используются buyya_read.c. Сначала создайте libmath-prebuilt.so, используя ndk-build и храните в jni-папке, где buyya_read.c хранится в проекте ur в elcipse.
Android.mk(To generate libbuyya_read.so to use as jni library using prebuilt library)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := math-prebuilt
LOCAL_SRC_FILES = libmath-prebuilt.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := buyya_read
LOCAL_SRC_FILES := buyya_read.c
LOCAL_LDLIBS := -llog
LOCAL_SHARED_LIBRARIES := math-prebuilt
include $(BUILD_SHARED_LIBRARY)
buyya_read.c
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <jni.h>
#include <stdio.h>
JNIEXPORT jint JNICALL Java_com_buyya_BuyyaJava_sum(JNIEnv *env,
jclass thiz, jint a, jint b) {
hello();
int res = add(a, b);
return res;
}
math.c // using this generate libmath-prebuilt.so
#include <stdio.h>
void hello()
{
printf("Hello world!\n");
}
int add(int a, int b)
{
printf("Hello world!\n");
return a+b;
}
Make file to generate libmath-prebuilt.so
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := math-prebuilt
LOCAL_SRC_FILES := math.c
LOCAL_LDLIBS := -llog
#LOCAL_EXPORT_C_INCLUDES:=../jni/
include $(BUILD_SHARED_LIBRARY)
Вы видите структуру каталога проекта внизу изображения.
![Структура проекта Dir]()
Ответ 4
Любой, кто ищет хорошую документацию по любым проблемам android.mk, ссылается на это:
https://github.com/Parrot-Developers/alchemy/blob/master/doc/android-mk.html
Я нашел это очень красиво объясненным простыми словами и рассмотрел большинство сценариев вокруг Android.mk. Надеюсь, что это поможет.
Ответ 5
Официальный анонс Android NDK hello-libs
Пример CMake
https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs
Главное - упаковать все версии .so
, о которых вы беспокоитесь, например:
-
distribution/gperf/lib/arm64-v8a/libgperf.so
-
distribution/gperf/lib/x86_64/libgperf.so
а затем выберите правильный вариант в CMake с помощью ${ANDROID_ABI}
.
Я также объяснил этот пример: Как связать предварительно созданную общую библиотеку с проектом Android NDK?