16

我正在移植 Box2D 以了解更多关于 android 移植的信息。

我可以编译项目,我看到以下内容....

ls库/

armeabi armeabi-v7a

现在我想做这样的事情,我不知道如何让它足够聪明来选择拱门(比如我想添加 x86)。如何在不将 .so 路径硬编码到规范拱门的情况下包含 .so ?

4

5 回答 5

16

只需按照 NDK 文档(APPLICATION-MK.html 和 PREBUILTS.html)中的描述在 android.mk 和 Application.mk 中定义您希望支持的架构:

V. ABI 预建二进制文件的选择:

如前所述,在构建期间提供与目标 ABI 兼容的预构建共享库至关重要。为此,请检查 TARGET_ARCH_ABI 的值,其值为:

armeabi => 面向 ARMv5TE 或更高 CPU 时 armeabi-v7a => 面向 ARMv7 或更高 CPU 时 x86 => 面向 x86 CPU 时 mips => 面向 MIPS CPU 时

请注意,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 预构建库,因为 armeabi 可以轻松地在相应的设备上运行。

于 2013-06-18T15:10:04.093 回答
15

这有效...

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)
于 2013-06-18T15:08:48.433 回答
2

Android NDK 官方hello-libsCMake 示例

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 项目?

于 2017-11-30T10:22:55.727 回答
1

任何寻找有关任何 android.mk 问题的良好文档的人,请参阅:

https://github.com/Parrot-Developers/alchemy/blob/master/doc/android-mk.html

我发现它用简单的语言很好地解释并涵盖了 Android.mk 周围的大部分场景。希望能帮助到你。

于 2017-04-07T19:38:45.000 回答
0

libmath-prebuilt.so 是一个预建库,其中包含一些供 buyya_read.c 使用的功能。首先使用 ndk-build 生成 libmath-prebuilt.so 并保存在 jni 文件夹中,buyya_read.c 保存在 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)

您可以在下图中看到项目目录结构。 项目目录结构

于 2016-06-22T08:21:05.883 回答