我有一个应用程序,它使用各种目标的本地库——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 作为插件部署正确的库,但这正是我想避免的。