我正在编写一个C程序,我希望在运行Linux的桌面上以及Android设备上执行该程序 我必须制作一些桌面特定的东西和一些Android特定的东西 我的问题是,有没有办法在C中获取操作系统版本,以便我可以处理程序是在桌面上还是在Android设备上执行的?
答案 0 :(得分: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);
// ...
}
在桌面上,property_get()
应返回空字符串。
您可以使用adb shell getprop
查看所有可能的Android属性。但是,请注意并非所有设备都支持它们。
更新:如果您不需要操作系统版本,但只是想知道您的C / C ++代码是否在Android上运行,那么非常简单的方法就是检查环境变量{{ 1}}存在,类似于:
ANDROID_PROPERTY_WORKSPACE
此方法只需要if (getenv("ANDROID_PROPERTY_WORKSPACE")) {
// running under Android
} else {
// running on desktop
}
提供的getenv()
。
答案 1 :(得分:7)
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);
}
ro.build.version.release
是一个类似“6.0”的字符串。您还可以获取ro.build.version.sdk
来获取sdk级别,这是一个类似于“23”的字符串。
答案 2 :(得分:3)
如果您使用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;
}
答案 3 :(得分:1)
如何使用AConfiguration_getSdkVersion()API?
#include <android/configuration.h>
...
auto apilevel = AConfiguration_getSdkVersion(app->config);
LOGI("Device API Level %d", apilevel);
答案 4 :(得分:0)
NDK提供直接api以获取应用程序目标sdk版本或api级别
android_get_device_api_level
android_get_application_target_sdk_version