Index: base/android/linker/linker_jni.cc |
diff --git a/base/android/linker/linker_jni.cc b/base/android/linker/linker_jni.cc |
index 1a11639dd5364d3039591bd66da7201126d6d9bf..b79eaf43bc156dd16efc2b3c21f752e6be097796 100644 |
--- a/base/android/linker/linker_jni.cc |
+++ b/base/android/linker/linker_jni.cc |
@@ -128,6 +128,50 @@ bool InitStaticMethodId(JNIEnv* env, |
return true; |
} |
+// Initialize a jfieldID corresponding to the static field of a given |clazz|, |
+// with name |field_name| and signature |field_sig|. |
+// |env| is the current JNI environment handle. |
+// On success, return true and set |*field_id|. |
+bool InitStaticFieldId(JNIEnv* env, |
+ jclass clazz, |
+ const char* field_name, |
+ const char* field_sig, |
+ jfieldID* field_id) { |
+ *field_id = env->GetStaticFieldID(clazz, field_name, field_sig); |
+ if (!*field_id) { |
+ LOG_ERROR("Could not find ID for static field '%s'", field_name); |
+ return false; |
+ } |
+ LOG_INFO( |
+ "%s: Found ID %p for static field '%s'", |
+ __FUNCTION__, *field_id, field_name); |
+ return true; |
+} |
+ |
+// Initialize a jint corresponding to the static integer field of a class |
+// with class name |class_name| and field name |field_name|. |
+// |env| is the current JNI environment handle. |
+// On success, return true and set |*value|. |
+bool InitStaticInt(JNIEnv* env, |
+ const char* class_name, |
+ const char* field_name, |
+ jint* value) { |
+ jclass clazz; |
+ if (!InitClassReference(env, class_name, &clazz)) |
+ return false; |
+ |
+ jfieldID field_id; |
+ if (!InitStaticFieldId(env, clazz, field_name, "I", &field_id)) |
+ return false; |
+ |
+ *value = env->GetStaticIntField(clazz, field_id); |
+ LOG_INFO( |
+ "%s: Found value %d for class '%s', static field '%s'", |
+ __FUNCTION__, *value, class_name, field_name); |
+ |
+ return true; |
+} |
+ |
// A class used to model the field IDs of the org.chromium.base.Linker |
// LibInfo inner class, used to communicate data with the Java side |
// of the linker. |
@@ -190,6 +234,23 @@ struct LibInfo_class { |
static LibInfo_class s_lib_info_fields; |
+// Retrieve the SDK build version and pass it into the crazy linker. This |
+// needs to be done early in initialization, before any other crazy linker |
+// code is run. |
+// |env| is the current JNI environment handle. |
+// On success, return true. |
+bool InitSDKVersionInfo(JNIEnv* env) { |
+ jint value = 0; |
+ if (!InitStaticInt(env, "android/os/Build$VERSION", "SDK_INT", &value)) |
+ return false; |
+ |
+ crazy_set_sdk_build_version(static_cast<int>(value)); |
+ LOG_INFO("%s: Set SDK build version to %d", |
+ __FUNCTION__, static_cast<int>(value)); |
+ |
+ return true; |
+} |
+ |
// The linker uses a single crazy_context_t object created on demand. |
// There is no need to protect this against concurrent access, locking |
// is already handled on the Java side. |
@@ -758,6 +819,11 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { |
return -1; |
} |
+ // Initialize SDK version info. |
+ LOG_INFO("%s: Retrieving SDK version info", __FUNCTION__); |
+ if (!InitSDKVersionInfo(env)) |
+ return -1; |
+ |
// Register native methods. |
jclass linker_class; |
if (!InitClassReference(env, |