检索android.os.Build ....系统属性我有一个纯粹的原生Android NDK应用程序,并且需要检索的值,如: android.os.Build.MODEL通过纯粹的原生Android应用
不幸我找不到如何解决这个问题的好例子?
检索android.os.Build ....系统属性我有一个纯粹的原生Android NDK应用程序,并且需要检索的值,如: android.os.Build.MODEL通过纯粹的原生Android应用
不幸我找不到如何解决这个问题的好例子?
NDK并不是要取代基于Java的API,而是要补充它。要获得Build,必须在C/C++中找到它的私有实现,或者通过JNI提供来自Java的信息。
伪代码:
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);
}
我不认为你可以遗憾的是做到这一点。您可以始终在VM中启动,并在检索要访问的值后通过JNI跳转到本地。
这些值很容易通过<sys/system_properties.h>
中定义的接口在本地代码中获得,该接口自第一次NDK发布以来一直存在。您只需要知道Java端使用的字符串标识符。幸运的是,使用开源操作系统,我们可以轻松找到这些操作系统。这是检索型号名称的一个工作示例。
#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. E.g., "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 (e.g., 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).
谢谢。这正是缺少的信息,并且在公开的android ndk文档中的任何地方都不明显或可见。如果您对方法签名和合约感兴趣,可以通过以下链接找到源代码:https://android.googlesource.com/platform/bionic/+/android-1.6_r1/libc/include/sys/system_properties.h –
谢谢你。我无法找到它的C/C++实现,但是我可以尝试通过JNI从Java中检索这个信息。我看到这样的例子,'JNIEnv *'是一个函数参数,后来用于调用诸如'GetMethodID'和'CallVoidMethod'之类的方法,但是我不确定我可以从哪里或如何调用我的本地方法?我将从哪里得到这个JNIEnv *参数? –
(即我的纯粹原生应用程序有'android_main'作为我的纯粹原生应用程序的入口点,因此我不知道如何调用一个函数,将JNIEnv *作为参数) –
啊,这将是一个问题,您从Build寻找什么样的信息? –