【问题标题】:How to know which API level I'm building for using ndk-build?如何知道我为使用 ndk-build 而构建的 API 级别?
【发布时间】:2012-07-24 12:35:40
【问题描述】:

我试图更好地理解使用 ndk-build 时 api 级别的选择是如何工作的。

我知道我可以在 Application.mk 中显式设置 APP_PLATFORM,否则 ndk-build 将针对清单中使用 android:minSdkVersion 指示的 api,但如果我的应用程序清单有android:minSdkVersionandroid:targetSdkVersion,这都高于 minSdkVersion?

ndk-build 会以 targetSdkVersion 为目标吗?我该如何检查?

如果它针对更高的 api 级别,我想我将能够使用仅适用于该级别的本机 api 构建,但是如果我在具有较低 api 级别的设备上运行应用程序,它应该会失败,所以在这种情况下我应该实现某种 api 级别检查,对吗?

【问题讨论】:

    标签: android c++ c android-ndk android-manifest


    【解决方案1】:
    • Android:minSdkVersion

    应用程序将在其上运行的 Android 平台的最低版本。

    • Android:targetSdkversion

    指定应用程序设计用于运行的 API 级别。

    • Android:maxSdkVersion

    应用程序设计运行的 Android 平台的最高版本。

    【讨论】:

    • 好吧,我知道这一点,文档说明了您还为 java api 清楚地写了什么,但我找不到本地构建系统的相同行为的明确引用,特别是对于特定情况我在问题中提到。而且,我想知道如何检查这个,也许是从一些 ndk-build 的输出中,但我找不到。
    【解决方案2】:

    在您定义 TARGET_PLATFORM 和 LOCAL_CFLAGS 之后,将此代码放入您的 Android.mk

    ifeq ($(TARGET_PLATFORM),android-7)
        LOCAL_CFLAGS   += -DANDROID7
    else
    ifeq ($(TARGET_PLATFORM),android-8)
        LOCAL_CFLAGS   += -DANDROID8
    else
    ifeq ($(TARGET_PLATFORM),android-9)
        LOCAL_CFLAGS   += -DANDROID9
    endif
    endif
    endif
    

    现在您可以在您的 C/C++ 代码中检查此定义:

    #if defined( ANDROID9 )
       // do stuff for API Level 9
    #endif
    

    【讨论】:

    • 很好,谢谢!如果有人想知道,我可以进行测试并了解 ndk-build 以清单中指示的 targetSdkVersion 为目标。
    • @athos 当时可能是真的,但我现在对此表示怀疑。如果您阅读this part,它会说“如果未指定,ndk-build 将针对 NDK 支持的最低 API 级别。”。
    • 它还说“当使用 Gradle 和 externalNativeBuild 时,不应直接设置此参数。相反,在模块级 build.gradle 文件的 defaultConfig 或 productFlavors 块中设置 minSdkVersion 属性。这使得确保您的库仅由安装在运行适当版本的 Android 的设备上的应用程序使用。”,但与 targetSdkVerion 完全无关。如果你今天说的是真的,那么将新应用上传到 Google Play 真的很难,因为你可能知道 targetSdkVersion 非常有限。
    【解决方案3】:

    使用$NDK/platforms/android-<level>/<abi>/usr/include/android/api-level.h中定义的__ANDROID_API__

    #if __ANDROID_API__ >= 21
    // building with Android NDK Native API level 21 or higher
    posix_fadvise64(fd, ...);
    #else
    // building with Android NDK Native API level 20 or lower
    syscall(__NR_arm_fadvise64_64, fd, ...);
    #endif
    

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 1970-01-01
      • 2016-08-15
      • 2015-01-14
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2019-04-28
      相关资源
      最近更新 更多