【问题标题】:How to set up Eclipse's Build Configurations to produce a proper, debuggable NDK app?如何设置 Eclipse 的构建配置以生成正确的、可调试的 NDK 应用程序?
【发布时间】:2014-01-28 14:30:22
【问题描述】:

我们有一个具有三种不同构建配置的 Android NDK 项目:

  1. 调试 - armeabi
  2. 调试 - armeabi-v7a
  3. 发布 - aremabi + armeabi-v7a

由于 Android 加载程序中的一个已知错误,我们指定了单独的 aremabi 和 armeabi-v7 调试配置,如果指定了多个 EABI,调试器可能会启动错误的 EABI 版本的应用程序,并且不会命中本机断点(More details here, at the end of the document)。

过去,我们编辑 Application.mk 文件并通过 APP_ABI 变量指定所需的 EABI。

我们希望避免这种手动编辑并利用 Eclipse 的构建配置并自动选择适当的 EABI 设置。

到目前为止,我们通过在Application.mk 文件中添加条件得到了一个可行的解决方案

这是我们的Application.mk 的外观:

ifeq ($(BUILD_CONFIG),RELEASE)
    APP_OPTIM := release
    APP_ABI := armeabi armeabi-v7a
else ifeq ($(BUILD_CONFIG),ARMEABIV7A_DEBUG) 
    APP_OPTIM := debug
    APP_ABI := armeabi-v7a 
else ifeq ($(BUILD_CONFIG),ARMEABI_DEBUG)
    APP_OPTIM := debug
    APP_ABI := armeabi
endif

此外,我们在 Eclipse 中定制了编译器构建命令行,以便将正确的 BUILD_CONFIG 变量传递给 make 脚本。

这对于编译目的非常有效,但是当我们尝试调试应用程序时问题就开始了。问题是我们不知道如何将BUILD_CONFIG 变量传递给ndk-gdb 脚本。

运行ndk-build DUMP_APP_ABI 命令将始终返回ARMEABI(预计因为我们没有明确定义BUILD_CONFIG 参数),据我了解,这是ndk-gdb 正在读取的值,以便决定调试器将启动哪个版本的应用程序。

有没有人设法让它工作或有一个替代解决方案,我们可以使用 Eclipse 的构建配置使编译和调试正常工作?可以运行修补或重命名Application.mk 文件的命令,但我们也不知道该怎么做。

【问题讨论】:

    标签: android eclipse debugging android-ndk adt


    【解决方案1】:

    Android 4.0 有错误。如果您提供 armeabiarmeabi-v7a 代码,那么即使您有 ARMv7 兼容的 CPU,也会加载 armeabi 代码。当armeabi 可用时,Android 4.0 会忽略armeabi-v7a

    这就是为什么您可以创建针对 armeabi (ARMv5) 的 2 个版本的库

    但没有 ARMv5 CPU (HTC Hero) 所以大多数 CPU 都是 ARMv6 或 ARMv7

    您应该在 Java 中检测您的 CPU 并加载正确的本机库。 这样做可以让您控制 .so 准确加载的内容。 您将能够创建具有 NEON 支持的库。

    【讨论】:

    • 非常感谢 Artem 的回复。事实上,我们已经添加了适当的步骤来控制您描述的运行时错误。我们正在寻找的实际上是一种编译时解决方案,它允许我们选择构建类型(调试或发布)和 eabi 规范(ARM 或 ARMV-v7),而无需我们手动编辑 .mk 文件。我们宁愿选择一个配置构建并让一切自动运行,包括集成调试。我将尝试分析 ndk-gdb 脚本,看看是否可以更改确定当前 APP_ABI 设置的解析逻辑。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2021-07-11
    • 2012-08-03
    • 2020-05-13
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    相关资源
    最近更新 更多