1

我有一个应用程序,它使用各种目标的本地库——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)

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

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

编辑1:

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

编辑2:

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

4

1 回答 1

2

然后执行以下操作:

  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");
于 2012-05-29T19:33:35.907 回答