【问题标题】:Android NDK - armeabi vs armeabi-v7a folderAndroid NDK - armeabi vs armeabi-v7a 文件夹
【发布时间】:2019-11-25 16:51:42
【问题描述】:

有一些像我一样的问题。

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?

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

// 二进制文件

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:断言“调用了纯虚函数!”失败

【问题讨论】:

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


    【解决方案1】:

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

    armeabi-v7a 是 armv7。这(以及至少 arm64-v8a)是您应该构建的目标。

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

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

    【讨论】:

    • 你说得对,我不明白如何修复错误消息。因为它适用于我的 armeabi-v7a 手机上的 armeabi 设置。
    • 抱歉,Arm 的命名约定是最差的。更正为版本号而不是核心号。
    【解决方案2】:

    armeabi 最高适用于 ARM 架构版本 V6,而 armeabi-v7a 指定架构版本 7,后缀 A 用于 Cortex-A15 等应用处理器。

    与 V6 相比,V7 具有完全不同的流水线行为以及一些很好且编译器友好的指令,例如 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 手机。

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 1970-01-01
      • 2012-11-15
      • 2021-12-28
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      相关资源
      最近更新 更多