【问题标题】:Android NDK : Compiling different libraries for different architecturesAndroid NDK:为不同的架构编译不同的库
【发布时间】:2013-10-14 10:22:27
【问题描述】:

我有一个必须为 armeabi 和 armeabi7a 编译的小型 c++ 库。我还有一个非常大的 c++ 库,只需要为 armeabi 编译。现在它们正在为两种架构编译(使用 NDK),但这使我的 .apk 变得非常大。是否可以针对仅针对 armeabi 编译的大型库?我该怎么做?

我的文件夹结构是这样的:

/jni/biglib/
/jni/smalllib/
/jni/Application.mk
/jni/Android.mk

我的 /jni/Application.mk 文件包含:

APP_ABI := armeabi-v7a armeabi
APP_OPTIM := release

我的根 /jni/Android.mk 文件结合了每个库的 Android.mk 文件:

LOCAL_PATH := $(call my-dir)
LOCAL_C_INCLUDE := $(LOCAL_PATH)/include

include $(addprefix $(LOCAL_PATH)/, $(addsuffix /Android.mk, \
    biglib \
    smalllib \
))

【问题讨论】:

  • 你能否破解你的小型库,使armeabi 版本在armeabi7a 设备上执行时工作得相当好?
  • 我不这么认为......它是一个第 3 方库,它在文档中说它必须为 armeabi7a 单独编译

标签: android android-ndk makefile java-native-interface


【解决方案1】:

这绝对是可能的。有一些代码 sn-ps 可以帮助您进行(没有针对 biglib 和 smallib 的 Android.mk 的确切内容,我无法为您提供更多帮助)。

1) 在Application.mk 中将APP_ABI 的顺序更改为APP_ABI := armeabi armeabi-v7a

2) 修改你的根Android.mk:

LOCAL_PATH := $(call my-dir)
LOCAL_C_INCLUDE := $(LOCAL_PATH)/include

# biglib is not built for armeabi-v7a
ifneq "$(TARGET_ARCH_ABI)" "armeabi-v7a"
  include $(LOCAL_PATH)/biglib/Android.mk
endif

# ----- cut here -----
# Place this snippet to every module which needs biglib, or where convenient.
# Now you will link against armeabi version of biglib.
ifeq "$(TARGET_ARCH_ABI)" "armeabi-v7a"
  LOCAL_LDFLAGS += $(LOCAL_PATH)/../obj/local/armeabi/libbigLib.so
endif
# ----- cut here -----

include $(LOCAL_PATH)/smalllib/Android.mk

仅此而已 - 您的 apk 文件现在不包含 armeabi-v7a 的 libbiglib.so

【讨论】:

  • 这适用于编译,但现在它在 armeabi-v7 手机上运行时崩溃,因为 Android 正在 armeabi-v7a 文件夹中寻找 libbiglib.so 而没有找到它。有没有办法让它在 v7 手机上默认为 armeabi 版本?我得到: java.lang.UnsatisfiedLinkError: 无法加载 biglib: findLibrary 在 java.lang.Runtime.loadLibrary(Runtime.java:429) 处返回 null
  • @slamnjam:日志是否说明了它找不到哪个库以及在哪个目录中?静态构造函数中有两个system.load() 语句吗?
  • @AlexCohn 是的,每个库都被不同的类使用,其中相关库在静态构造函数中加载。事实上,我检查了设备,甚至设备上的 libs 文件夹中都没有安装大库。我创建了一个新问题来解决这个问题:stackoverflow.com/questions/19366009/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多