在C中使用NDK获取操作系统版本

Ste*_*han 5 c android android-ndk

我正在编写一个C程序,我想在运行Linux的桌面上以及Android设备上执行.
我必须制作一些桌面特定的东西和一些Android特定的东西.
我的问题是,有没有办法在C中获取操作系统版本,所以如果程序在桌面或Android设备上执行,我可以处理?

wei*_*yin 8

property_get()不适合我,而是我用过__system_property_get().

#include <sys/system_properties.h>

void foo() {
    char osVersion[PROP_VALUE_MAX+1];
    int osVersionLength = __system_property_get("ro.build.version.release", osVersion);
}
Run Code Online (Sandbox Code Playgroud)

ro.build.version.release是一个像"6.0"的字符串.你也可以获得ro.build.version.sdksdk级别,这是一个像"23"这样的字符串.


mvp*_*mvp 7

在您的本机代码中,您可以使用property_get(),如下所示:

#include <cutils/properties.h>

// ...

int myfunction() {
    char sdk_ver_str[PROPERTY_VALUE_MAX] = "0";
    property_get("ro.build.version.sdk", sdk_ver_str, "0");
    sdk_ver = atoi(sdk_ver_str);
    // ...   
}
Run Code Online (Sandbox Code Playgroud)

在桌面上,property_get()应该返回空字符串.

您可以使用adb shell getprop查看所有可能的Android属性.但是,请注意并非所有设备都支持它们.


更新:如果您不需要操作系统版本,但只是想知道您的C/C++代码是否在Android上运行,那么非常简单的方法就是检查环境变量是否ANDROID_PROPERTY_WORKSPACE存在,例如:

if (getenv("ANDROID_PROPERTY_WORKSPACE")) {
    // running under Android
} else {
    // running on desktop
}
Run Code Online (Sandbox Code Playgroud)

这种方法只需要getenv()提供stdlib.h.

  • 我在NDK中找不到`<cutils/properties.h>`,但是使用`<sys/system_properties.h>`中的`__system_property_get`工作了. (5认同)

ali*_*dro 6

NDK提供直接api来获取应用程序目标sdk版本或api级别

android_get_device_api_level
android_get_application_target_sdk_version
Run Code Online (Sandbox Code Playgroud)

参见ndk官方文档

  • 这应该在顶部。 (2认同)

Mat*_*ich 5

如果使用java原生接口,可以使用java函数获取sdk版本号,对android版本依赖较小。

int api_version( struct android_app *app ) {

    JNIEnv* env;
    app->activity->vm->AttachCurrentThread( &env, NULL );

    // VERSION is a nested class within android.os.Build (hence "$" rather than "/")
   jclass versionClass = env->FindClass("android/os/Build$VERSION" );
   jfieldID sdkIntFieldID = env->GetStaticFieldID(versionClass, "SDK_INT", "I" );

   int sdkInt = env->GetStaticIntField(versionClass, sdkIntFieldID );
   app->activity->vm->DetachCurrentThread();
   return sdkInt;
}
Run Code Online (Sandbox Code Playgroud)

  • 至少在我的开发环境(nVidia AndroidWorks、Visual Studio 2013)中,property_get 不容易使用,因为它不是库存 android ndk 的一部分。我想我可以找到 property_get 的源代码并将其添加到我的项目中。然而,在进入该项目 10 分钟后,我意识到 JNI 会做得很好。我把我的答案贴在这里并不是说人们不能或不应该使用你的答案,而是为了给人们更多的选择。 (4认同)