安卓NDK : Compiling different libraries for different architectures

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

我有一个小型 C++ 库,必须为armeabi 和armeabi7a 进行编译。我还有一个非常大的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 \
))

最佳答案

这绝对是可能的。有一些代码 fragment 可以帮助您继续(没有 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

关于安卓NDK : Compiling different libraries for different architectures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19358130/

相关文章:

c++ - 如何与 libtiff 链接

android - 如何向MIFARE卡发送NFCA命令?

java - 双指针 Android JNI

gcc - android 工具链缺少 crtbegin_so.o(自定义构建)

makefile - 如何在 Cygwin 中运行 makefile

c - 如何在 CMake 中使用特定的链接脚本(*.lds)?

android - 向各个方向滚动

android - 协调器布局,工具栏下方的 Activity

android-ndk - 找不到方法ndk()作为参数

Android NDK 位置不可配置