gpt4 book ai didi

android - 如何强制 Android 构建脚本根据其 eabi 版本将 native 库放入正确的库文件夹中?

转载 作者:行者123 更新时间:2023-11-29 22:05:44 25 4
gpt4 key购买 nike

我有一个应用程序,它使用各种目标的 native 库——ARMv6、ARMv6+vfp、ARM7+vfp、ARM7+Neon、ARM7 + Tegra 以及一些通用库。我的目标是将所有库打包到一个 .apk 文件中,这样我就不必分发单独的版本——我不太关心 .apk 的总大小。

这是我的 Android.mk 脚本——只是一个例子,但有足够的信息:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi
LOCAL_MODULE := prebuilt_arm_v6vfp
LOCAL_SRC_FILES := ../bin/libplayer_v6vfp.so
LOCAL_EXPORT_LDLIBS := ../libplayer_v6vfp.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_MODULE := prebuilt_arm_v7n
LOCAL_SRC_FILES := ../bin/libplayer_v7n.so
LOCAL_EXPORT_LDLIBS := ../libplayer_v7n.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := player

LOCAL_SRC_FILES := some_cpp_sources...

LOCAL_LDFLAGS := -L$(LOCAL_PATH)/../bin
LOCAL_LDLIBS := -llog -lz -lm -lplayer_v7n -lplayer_v6vfp
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

include $(BUILD_SHARED_LIBRARY)

现在我遇到了以下问题——它创建了包含 armeabiarmeabi-v7a 子文件夹的 libs 文件夹——没关系。但是两个子文件夹的内容是相同的,都包含 libplayer_v7n.so 和 libplayer_v6vfp.so。

我如何根据其 eabi 版本确保每个子文件夹仅包含正确版本的 native 库?

编辑 1:

如您所见,我将 libplayer.so 与两个共享库链接在一起,它们具有兼容的接口(interface)。我想在检测到 CPU 类型后加载到我的 Java 包装器中时动态选择正确的库。但似乎这是不可能的。知道如何动态选择正确的库吗?对于这种常见情况,必须有解决方案。

编辑 2:

看来我只能将我的 libplayer.so 链接到一个库,并且必须在运行时选择它的正确版本。但是现在的问题是如何在lib文件夹中存放六个不同版本但同名的原生库。子文件夹似乎是一个显而易见的解决方案,但我不确定是否可行。另一种解决方案是通过单独的 .apk 作为插件部署正确的库,但这正是我想要避免的。

最佳答案

然后执行以下操作:

  1. 使用相同的名称(例如:libplayer_arch.so)命名架构特定的库并将它们放在不同的目录中。
  2. 将 libplayer.so 链接到 libplayer_arch.so
  3. 像这样编写您的 Java 代码:

.

if (isArmv7())
{
System.loadLibrary("armv7/libplayer_arch.so");
}
else
{
System.loadLibrary("armv6/libplayer_arch.so");
}
System.loadLibrary("libplayer.so");

关于android - 如何强制 Android 构建脚本根据其 eabi 版本将 native 库放入正确的库文件夹中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10803542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com