有一些像我这样的问题。
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:断言“调用了纯虚函数!”失败
答案 0 :(得分:0)
armeabi是armv5。不再受支持。您可以假装它不存在。
armeabi-v7a是armv7。这(至少要与arm64-v8a一起)是您要构建的。
您的应用程序崩溃的事实是另一个问题,错误消息告诉您发生了什么:正在调用一个纯虚函数。某些子类未实现其需要实现的虚函数。
还有第三个问题。您的APP_STL
是gnustl_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手机。