Android NDK:使用BUILD_EXECUTABLE和armeabi-v7a-hard构建胖二进制文件

时间:2016-01-08 11:07:38

标签: android android-ndk android-build

简短:Android NDK系统如何转换" APP_ABI:= armeabi-v7a-hard"最终的.so文件位于" libs / armeabi-v7a"?在Android.mk中做同样事情的正确方法是什么?目前,要构建独立的可执行文件并将其放在与不同ABI相对应的文件夹中,我使用它,这看起来很难看,因为硬编码" ifeq($(TARGET_ARCH_ABI),armeabi-v7a-hard)":

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
SAVED_NDK_APP_DST_DIR := $(NDK_APP_DST_DIR)

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a-hard)
    NDK_APP_DST_DIR := assets/armeabi-v7a
else
    NDK_APP_DST_DIR := assets/$(TARGET_ARCH_ABI)
endif

LOCAL_MODULE := run_pie
LOCAL_SRC_FILES := run_pie.c    
include $(BUILD_EXECUTABLE)
NDK_APP_DST_DIR := $(SAVED_NDK_APP_DST_DIR)

长:在我的Android应用中,我使用了一组独立的二进制文件。构建后,它们存储在APK资源中。在第一个应用程序启动时,我将它们复制到我的应用程序私有文件夹chmod 777,然后将它们用作系统实用程序,例如" ls"或" cp"。我想生成"胖二进制":单个APK,其中包含所有ABI的二进制文件,并在安装后为当前设备选择正确的二进制文件。对于.so库,Android会自动执行所有这些操作。 " APP_ABI:= armeabi-v7a-hard"是NDK构建系统的内部,它在文档中说明,最终的.so文件用于" armeabi-v7a-hard"放在" armeabi-v7a"夹。我可以为我的二进制文件做同样的事情,目前我的方法是有效的,但它看起来很难看。

将输出二进制文件放到以ABI命名的自定义文件夹并处理" armeabi-v7a-hard"的正确方法是什么?到" armeabi-v7a"转换吗

1 个答案:

答案 0 :(得分:1)

如果您查看$NDK/build/core/setup-toolchain.mk,您会在那里找到以下内容:

# compute NDK_APP_DST_DIR as the destination directory for the generated files
NDK_APP_DST_DIR := $(NDK_APP_LIBS_OUT)/$(TARGET_ARCH_ABI)
# install armeabi-v7a-hard to lib/armeabi-v7a, unless under testing where env. var. _NDK_TESTING_ALL_
# is set to one of yes, all, all32, or all64
ifeq (,$(filter yes all all32 all64,$(_NDK_TESTING_ALL_)))
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a-hard)
NDK_APP_DST_DIR := $(NDK_APP_LIBS_OUT)/armeabi-v7a
endif
endif

因此,正如您所看到的,它与您在Android.mk中采用的方法相同。唯一的区别是您没有考虑到_NDK_TESTING_ALL_,这是NDK测试系统的内部。所以,请继续按原样使用Android.mk,不要担心。

另一种方法是像往常一样构建可执行文件,但将它们命名为lib${TOOLNAME}.so。在这种情况下,它们将被置于默认NDK_APP_DST_DIR以及真实库中,当在设备上安装时,Android Package Manager会将它们复制到适当的位置。然后,在第一次运行时,您可以从lib文件夹中复制它们(而不是像当前那样从资产中复制它们),并适当地重命名。