【问题标题】:NDK for the Android 6.0 API?Android 6.0 API 的 NDK?
【发布时间】:2015-12-07 00:31:20
【问题描述】:

我正在测试一个脚本以从命令行构建一个共享对象。根据NDK Downloads,最新下载的是android-ndk-r10e(我以为这是旧的下载)。

但是,当我检查 android-23 时,我发现没有可用的东西:

$ echo "$ANDROID_NDK_ROOT"
/opt/android-ndk-r10e

$ ls "$ANDROID_NDK_ROOT/platforms"
android-12  android-15  android-18  android-3   android-8
android-13  android-16  android-19  android-4   android-9
android-14  android-17  android-21  android-5

Android 6.0 的 NDK(我认为是 android-23)是否不可用?或者可能是我不太明白的其他内容。

(我担心主要版本的碰撞,以及它所包含的破坏性变化,比如rand function was changed 和破坏的东西)。

【问题讨论】:

    标签: android-ndk android-6.0-marshmallow


    【解决方案1】:

    6.0 中没有新的原生 API,因此不需要在 NDK 中提供该目标 - 它与 5.1 和 5.0 的目标相同。

    使用 NDK 构建时,目标平台被选为实际存在于您选择的目标平台之前的最新平台(以及最早的平台,用于稍后引入的 ABI)。

    请记住,“目标 API”在 Java 和本机代码之间的行为完全不同。如果您使用一个目标 API 级别构建本机代码,则该代码可能根本无法在旧版本上运行 - 参见例如https://stackoverflow.com/a/27338365/3115956https://stackoverflow.com/a/27093163/3115956

    因此,除非您想尝试在某些平台上手动加载和使用新功能(如果有),否则您应该将目标版本(jni/Application.mk 中的APP_PLATFORM)设置为您希望代码运行的最低版本,即对应minSdkVersion

    【讨论】:

    • 6.0 表示主要版本升级。主要版本的颠簸意味着某些东西以一种破坏性的方式发生了变化。我希望像函数这样的东西被改为内联。这在过去发生过;例如,AOSP 更改了 rand 函数 (Cannot load library: reloc_library (1285): cannot locate 'rand')。
    • 是的,APP_PLATFORM should match minSdkVersion
    • @jww:即使它是主要版本,它仍然可以运行为旧版本构建的二进制文件。一般来说(除了极少数例外),所有 android 版本都是向后兼容的,即可以运行为旧版本构建的二进制文件。 5.0 中的 rand 函数也是如此;为旧版本构建的二进制文件继续正常工作 - rand 之前调用的较低级别函数仍然存在以实现兼容性,即使新代码最终调用其他东西。
    【解决方案2】:

    据我了解,NDK 处于单独的开发“流”中,其发布频率低于或高于 Android 平台本身。您应该能够毫无问题地为 android-23 设备开发 NDK 应用程序,Google 可能只是还没有时间更新 android-23 的 NDK 版本。

    看修订版,r10e是不久前发布的,但事实上它也是今天的最新版本。

    【讨论】:

    • 实际上,我们需要它作为 SYSROOT。例如,--sysroot=/opt/android-ndk-r10e/platforms/android-23/arch-arm。 (我认为,或者至少我们过去是这样做的)。
    • 为什么需要 SYSROOT 来指向可能的最高平台?一般来说,为 android-3 构建的库可以在所有现代 ARM 设备上运行。如果您想要 64 位二进制文​​件,则必须选择平台 android-21。即使是现在,也有一些平台“数字”(例如 android-10)被跳过,因为从原生库的角度来看,它们没有引入新的 API。
    • @Alex - 6.0 表示主要版本升级。主要版本的颠簸意味着某些东西以一种破坏性的方式发生了变化。我希望像函数这样的东西被改为内联。这在过去发生过;例如,AOSP 更改了 rand 函数 (Cannot load library: reloc_library (1285): cannot locate 'rand')。
    • 是的,在为平台 N 构建的二进制文件无法在平台 N-1 上运行并返回之前,这种情况经常发生,但绝不会反之反之亦然。实际上,这是将旧平台保留在最新 NDK 中的理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    相关资源
    最近更新 更多