Recuperar android.os.Build … propiedades del sistema mediante la aplicación puramente nativa de Android

Tengo una aplicación NDK puramente nativa de Android, y necesito recuperar valores como: android.os.Build.MODEL

Desafortunadamente no puedo encontrar buenos ejemplos de cómo hacer esto.

El NDK no está destinado a reemplazar la API basada en Java, sino a complementarla. Para obtener Build tendrás que encontrar su implementación privada en C / C ++ o proporcionar la información de Java a través de JNI.

Código Pseudo:

android_main(struct *android_app){ JNIEnv *env = android_app->activity->env; jclass build_class = FindClass(env, "android.os.Build"); jfieldID brand_id = GetStaticFieldID(env, build_class, "BRAND", "Ljava/lang/String;"); jstring brand_obj = (jstring)GetStaticObjectField(env, brand_id); } 

Estos valores son fáciles de obtener en código nativo a través de la interfaz definida en <sys/system_properties.h> , que ha existido desde la primera versión de NDK. Sólo necesita conocer el identificador de cadena utilizado en el lado de Java. Afortunadamente, con un sistema operativo de código abierto, podemos encontrar estos fácilmente. A continuación, se muestra un ejemplo práctico de recuperación del nombre del modelo.

 #include <sys/system_properties.h> // // Public codes are defined in http://developer.android.com/reference/java/lang/System.html#getProperty(java.lang.String). // Codes below are defined in https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/os/Build.java. // Items with * are intended for display to the end user. // #define ANDROID_OS_BUILD_VERSION_RELEASE "ro.build.version.release" // * The user-visible version string. Eg, "1.0" or "3.4b5". #define ANDROID_OS_BUILD_VERSION_INCREMENTAL "ro.build.version.incremental" // The internal value used by the underlying source control to represent this build. #define ANDROID_OS_BUILD_VERSION_CODENAME "ro.build.version.codename" // The current development codename, or the string "REL" if this is a release build. #define ANDROID_OS_BUILD_VERSION_SDK "ro.build.version.sdk" // The user-visible SDK version of the framework. #define ANDROID_OS_BUILD_MODEL "ro.product.model" // * The end-user-visible name for the end product.. #define ANDROID_OS_BUILD_MANUFACTURER "ro.product.manufacturer" // The manufacturer of the product/hardware. #define ANDROID_OS_BUILD_BOARD "ro.product.board" // The name of the underlying board, like "goldfish". #define ANDROID_OS_BUILD_BRAND "ro.product.brand" // The brand (eg, carrier) the software is customized for, if any. #define ANDROID_OS_BUILD_DEVICE "ro.product.device" // The name of the industrial design. #define ANDROID_OS_BUILD_PRODUCT "ro.product.name" // The name of the overall product. #define ANDROID_OS_BUILD_HARDWARE "ro.hardware" // The name of the hardware (from the kernel command line or /proc). #define ANDROID_OS_BUILD_CPU_ABI "ro.product.cpu.abi" // The name of the instruction set (CPU type + ABI convention) of native code. #define ANDROID_OS_BUILD_CPU_ABI2 "ro.product.cpu.abi2" // The name of the second instruction set (CPU type + ABI convention) of native code. #define ANDROID_OS_BUILD_DISPLAY "ro.build.display.id" // * A build ID string meant for displaying to the user. #define ANDROID_OS_BUILD_HOST "ro.build.host" #define ANDROID_OS_BUILD_USER "ro.build.user" #define ANDROID_OS_BUILD_ID "ro.build.id" // Either a changelist number, or a label like "M4-rc20". #define ANDROID_OS_BUILD_TYPE "ro.build.type" // The type of build, like "user" or "eng". #define ANDROID_OS_BUILD_TAGS "ro.build.tags" // Comma-separated tags describing the build, like "unsigned,debug". #define ANDROID_OS_BUILD_FINGERPRINT "ro.build.fingerprint" // A string that uniquely identifies this build. 'BRAND/PRODUCT/DEVICE:RELEASE/ID/VERSION.INCREMENTAL:TYPE/TAGS'. char model_id[PROP_VALUE_MAX]; // PROP_VALUE_MAX from <sys/system_properties.h>. int len; len = __system_property_get(ANDROID_OS_BUILD_MODEL, model_id); // On return, len will equal (int)strlen(model_id). 

No creo que puedas hacer esto por desgracia. Siempre se puede iniciar en VM y saltar a través de JNI a nativos después de recuperar los valores que desea acceder.

  • Cómo convertir char a jstring en JNI?
  • Android NDK: ¿Cómo limpiar el código nativo después de reiniciar la actividad?
  • Falta de correspondencia entre la firma del método y la llamada real
  • Android ioctl: permisos y uso de root
  • Clases del editor de vídeo de Android
  • Android NDK - NativeActivity vs JNI lib
  • Integración o compilación de instrucciones para libjpeg-turbo en Android
  • No se puede escribir en el archivo en el emulador de Android
  • Extraño: no se puede cambiar el valor de Integer en jni
  • ¿Debería evitarse también el finalizador de Java para la gestión del ciclo de vida de los objetos nativos?
  • JNI proguard obfuscation
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.