Android NDK-armeabi vs armeabi-v7a文件夹

时间:2019-07-16 21:53:50

标签: android android-ndk arm armv7 ndk-build

有一些像我这样的问题。

why I need put *.so files in both armeabi-v7a and armeabi folders?

Why armeabi-v7a conflicts with armeabi of another module?

Why use armeabi-v7a code over armeabi code?

但是我还不清楚。我有很多.so文件用于armeabi和armeabi-v7a。

//二进制文件

armeabi/libarmeabi-v7a-module1.so
armeabi/libarmeabi-v7a-module2.so

// Application.mk文件

APP_ABI := armeabi
APP_PLATFORM := android-19
APP_STL := gnustl_shared

// Android.mk文件

include $(CLEAR_VARS)
LOCAL_MODULE := module1
LOCAL_SRC_FILES := $(LOCAL_PATH)/armeabi/libarmeabi-v7a-module1.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := module2
LOCAL_SRC_FILES := $(LOCAL_PATH)/armeabi/libarmeabi-v7a-module2.so
include $(PREBUILT_SHARED_LIBRARY)

此设置在armeabi-v7a设备上正常工作。 但是,当我在Application.mk文件中设置armeabi-v7a abi时,我的应用程序崩溃了。崩溃消息如下:

  

A / libc:   /Volumes/Android/buildbot/src/android/ndk-release-r16/external/libcxx/../../external/libcxxabi/src/abort_message.cpp:73:   abort_message:断言“调用了纯虚函数!”失败

2 个答案:

答案 0 :(得分:0)

armeabi是armv5。不再受支持。您可以假装它不存在。

armeabi-v7a是armv7。这(至少要与arm64-v8a一起)是您要构建的。

您的应用程序崩溃的事实是另一个问题,错误消息告诉您发生了什么:正在调用一个纯虚函数。某些子类未实现其需要实现的虚函数。

还有第三个问题。您的APP_STLgnustl_shared,但错误消息表明您的库之一是使用libc ++构建的。这两个是不兼容的。您必须为整个应用程序使用相同的STL(并且由于使用了多个共享库,因此它必须是共享变体)。

答案 1 :(得分:0)

armeabi适用于最高ARM体系结构版本V6,而armeabi-v7a指定体系结构版本7,后缀A用于诸如Cortex-A15之类的应用处理器。

与V6相比,V7的pipleline行为截然不同,另外还有一些不错的且对编译器友好的指令,例如ubfx

例如:

a = (b>>5) & 0x3ff;

// armv6:
lsl a, b, #17
lsr a, a, #22

// armv7:
ubfx a, b, #5, #10 // unsigned bit-field extract from bit 5, ten bits long

如上所示,您需要两条依赖于V6的指令,而V7只需要一条指令,考虑到编译器对这些新指令的友好程度与V6上新出现的类似DSP的指令(它们从未被利用过)不同,这非常了不起通过编译器。

由于编译器必须决定要使用哪些指令以及如何调度它们,因此生成的机器代码是不同的,.so文件和文件夹也不同。

我将armeabi一律排除在abiFilters之内,因为实际上没有低于V7的Android手机。