简短: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"转换吗
答案 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
文件夹中复制它们(而不是像当前那样从资产中复制它们),并适当地重命名。