Подтвердить что ты не робот

NDK: как включить сборную общую библиотеку независимо от архитектуры

Я работаю над портированием Box2D, чтобы узнать немного больше о переносе android.

Я могу получить компиляцию проекта, и я вижу следующее....

ls libs/

armeabi armeabi-v7a

Теперь я хочу сделать что-то вроде этого, но я не знаю, как сделать его достаточно умным, чтобы выбрать arch (скажем, я хотел добавить x86). Как включить .so без жесткого кодирования пути .so в spec arch?

4b9b3361

Ответ 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?