【发布时间】:2013-06-18 14:55:34
【问题描述】:
我正在移植 Box2D 以了解更多关于 android 移植的知识。
我可以编译项目,我看到以下内容......
ls 库/
armeabi armeabi-v7a
现在我想做this 之类的事情,但我不知道如何让它变得足够聪明来选择拱门(比如我想添加 x86)。如何在不将 .so 路径硬编码到规范架构的情况下包含 .so?
【问题讨论】:
标签: android-ndk
我正在移植 Box2D 以了解更多关于 android 移植的知识。
我可以编译项目,我看到以下内容......
ls 库/
armeabi armeabi-v7a
现在我想做this 之类的事情,但我不知道如何让它变得足够聪明来选择拱门(比如我想添加 x86)。如何在不将 .so 路径硬编码到规范架构的情况下包含 .so?
【问题讨论】:
标签: android-ndk
按照 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-libsCMake 示例
关键是打包你关心的.so的所有版本,例如:
distribution/gperf/lib/arm64-v8a/libgperf.sodistribution/gperf/lib/x86_64/libgperf.so然后在 CMake 上选择正确的一个:${ANDROID_ABI}。
我已经在How to link a prebuilt shared Library to an Android NDK project?进一步解释了这个例子
【讨论】:
任何正在寻找有关任何 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)
【讨论】: