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

时间:2012-05-29 17:00:22

标签: android android-ndk

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

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

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

编辑1:

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

编辑2:

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

1 个答案:

答案 0 :(得分:2)

然后执行以下操作:

  1. 命名具有相同名称的体系结构特定库(例如:libplayer_arch.so)&把它们放在不同的目录中。
  2. 将libplayer.so链接到libplayer_arch.so
  3. 编写这样的Java代码:
  4. if (isArmv7())
    {
        System.loadLibrary("armv7/libplayer_arch.so");
    }
    else
    {
        System.loadLibrary("armv6/libplayer_arch.so");
    }
    System.loadLibrary("libplayer.so");