androidndk:为不同的体系结构编译不同的库 我有一个小型的C++库,必须为ARMeABI和ARMEABI7A编译。我还有一个非常大的C++库,只需要为ARMeABI编译。目前正在为这两种体系结构编译它们(使用NDK),但这使得my.apk变得非常大。有可能只针对armeabi编译大型库吗?我该怎么做

androidndk:为不同的体系结构编译不同的库 我有一个小型的C++库,必须为ARMeABI和ARMEABI7A编译。我还有一个非常大的C++库,只需要为ARMeABI编译。目前正在为这两种体系结构编译它们(使用NDK),但这使得my.apk变得非常大。有可能只针对armeabi编译大型库吗?我该怎么做,android,android-ndk,makefile,java-native-interface,Android,Android Ndk,Makefile,Java Native Interface,我的文件夹结构如下所示: /jni/biglib/ /jni/smalllib/ /jni/Application.mk /jni/Android.mk My/jni/Application.mk文件包含: APP_ABI := armeabi-v7a armeabi APP_OPTIM := release 我的root/jni/Android.mk文件组合了每个库的Android.mk文件: LOCAL_PATH := $(call my-dir) LOCAL_C_INCLUDE :=

我的文件夹结构如下所示:

/jni/biglib/
/jni/smalllib/
/jni/Application.mk
/jni/Android.mk
My/jni/Application.mk文件包含:

APP_ABI := armeabi-v7a armeabi
APP_OPTIM := release
我的root/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 \
))

这绝对是可能的。这里有一些代码片段可以帮助您(如果没有针对biglib和smallib的Android.mk的确切内容,我将无法为您提供更多帮助)

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

2) 修改您的root
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
文件现在不包含
libbiglib。因此
对于armeabi-v7a来说

是完全可能的。这里有一些代码片段可以帮助您(如果没有针对biglib和smallib的Android.mk的确切内容,我将无法为您提供更多帮助)

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

2) 修改您的root
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
文件现在不包含
libbiglib。因此
对于armeabi-v7a

您能否破解您的小型库,使
armeabi
版本在
armeabi7a
设备上执行时运行良好?我不这么认为。。。这是一个第三方库,文档中说它必须为armeabi7a单独编译。你能破解你的小库吗?
armeabi7a
版本在
armeabi7a
设备上执行时运行良好?我不这么认为。。。这是一个第三方库,文档中说它必须为armeabi7aThis单独编译。它是为编译工作的,但现在它在运行时在armeabi-v7手机上崩溃了,因为Android正在寻找libbiglib.so,在armeabi-v7a文件夹中找不到它。有没有办法让它在v7手机上默认为armeabi版本?我得到:java.lang.UnsatisfiedLinkError:无法加载biglib:findLibrary在java.lang.Runtime.loadLibrary(Runtime.java:429)@slamnjam:日志是否说明找不到哪个库以及在哪个目录中?在静态构造函数中是否有两个
system.load()
语句?@AlexCohn是的,每个库都由一个不同的类使用,其中相关库在静态构造函数中加载。事实上,我在设备上进行了检查,而大库甚至没有安装在设备上的libs文件夹中。我提出了一个新的问题来解决这个问题:这对于编译是有效的,但是现在它在运行时在armeabi-v7手机上崩溃了,因为Android正在寻找libbiglib.so,在armeabi-v7a文件夹中,却找不到它。有没有办法让它在v7手机上默认为armeabi版本?我得到:java.lang.UnsatisfiedLinkError:无法加载biglib:findLibrary在java.lang.Runtime.loadLibrary(Runtime.java:429)@slamnjam:日志是否说明找不到哪个库以及在哪个目录中?在静态构造函数中是否有两个
system.load()
语句?@AlexCohn是的,每个库都由一个不同的类使用,其中相关库在静态构造函数中加载。事实上,我在设备上进行了检查,而大库甚至没有安装在设备上的libs文件夹中。我创建了一个新问题来解决这个问题: