我有一个应用程序,它使用本机库用于各种目标 - 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作为插件部署正确的库,但这正是我想要避免的..
答案 0 :(得分:2)
然后执行以下操作:
if (isArmv7())
{
System.loadLibrary("armv7/libplayer_arch.so");
}
else
{
System.loadLibrary("armv6/libplayer_arch.so");
}
System.loadLibrary("libplayer.so");