Получение версии ОС с NDK в C

Я пишу программу на C, которую хочу выполнить на моем рабочем столе под управлением Linux, а также на устройстве Android.
Я должен сделать некоторые конкретные вещи для настольных компьютеров и некоторые специфические для Android вещи.
Мой вопрос: есть ли способ получить версию ОС на C, чтобы я мог справиться, если программа выполняется на рабочем столе или на Android-устройстве?

В вашем родном коде вы можете использовать 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. Но имейте в виду, что не все из них поддерживаются всеми устройствами.


UPDATE : Если вам не нужна версия ОС, но просто хотите сказать, работает ли ваш C / C ++-код на Android, очень простой способ проверить, существует ли переменная окружения ANDROID_PROPERTY_WORKSPACE , например:

 if (getenv("ANDROID_PROPERTY_WORKSPACE")) { // running under Android } else { // running on desktop } 

Этот метод требует только getenv() , который предоставляется stdlib.h .

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».

Если вы используете собственный интерфейс 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; } - 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; } 

Как насчет использования API AConfiguration_getSdkVersion ()?

 #include <android/configuration.h> ... auto apilevel = AConfiguration_getSdkVersion(app->config); LOGI("Device API Level %d", apilevel);