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) 修改您的rootAndroid.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) 修改您的rootAndroid.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文件夹中。我创建了一个新问题来解决这个问题: