我正在移植 Box2D 以了解更多关于 android 移植的信息。
我可以编译项目,我看到以下内容....
ls库/
armeabi armeabi-v7a
现在我想做这样的事情,但我不知道如何让它足够聪明来选择拱门(比如我想添加 x86)。如何在不将 .so 路径硬编码到规范拱门的情况下包含 .so ?
我正在移植 Box2D 以了解更多关于 android 移植的信息。
我可以编译项目,我看到以下内容....
ls库/
armeabi armeabi-v7a
现在我想做这样的事情,但我不知道如何让它足够聪明来选择拱门(比如我想添加 x86)。如何在不将 .so 路径硬编码到规范拱门的情况下包含 .so ?
只需按照 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 可以轻松地在相应的设备上运行。
这有效...
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)
Android NDK 官方hello-libs
CMake 示例
关键是打包.so
您关心的所有版本,例如:
distribution/gperf/lib/arm64-v8a/libgperf.so
distribution/gperf/lib/x86_64/libgperf.so
然后在 CMake 上选择正确的一个:${ANDROID_ABI}
.
我在以下位置进一步解释了该示例:如何将预构建的共享库链接到 Android NDK 项目?
任何寻找有关任何 android.mk 问题的良好文档的人,请参阅:
https://github.com/Parrot-Developers/alchemy/blob/master/doc/android-mk.html
我发现它用简单的语言很好地解释并涵盖了 Android.mk 周围的大部分场景。希望能帮助到你。
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)