summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/jni/platform/host/HostRuntime.cpp68
1 files changed, 36 insertions, 32 deletions
diff --git a/core/jni/platform/host/HostRuntime.cpp b/core/jni/platform/host/HostRuntime.cpp
index 88d9fcb6a96b..f7a4f817b3e0 100644
--- a/core/jni/platform/host/HostRuntime.cpp
+++ b/core/jni/platform/host/HostRuntime.cpp
@@ -20,6 +20,7 @@
#include <android_runtime/AndroidRuntime.h>
#include <jni_wrappers.h>
#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedUtfChars.h>
#include <nativehelper/jni_macros.h>
#include <unicode/putil.h>
#include <unicode/udata.h>
@@ -259,35 +260,49 @@ static void* mmapFile(const char* dataFilePath) {
#endif
}
-// Loads the ICU data file from the location specified in the system property ro.icu.data.path
+// returns result from java.lang.System.getProperty
+static string getJavaProperty(JNIEnv* env, const char* property_name) {
+ jclass system = FindClassOrDie(env, "java/lang/System");
+ jmethodID getPropertyMethod =
+ GetStaticMethodIDOrDie(env, system, "getProperty",
+ "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
+
+ auto jString = (jstring)env->CallStaticObjectMethod(system, getPropertyMethod,
+ env->NewStringUTF(property_name),
+ env->NewStringUTF(""));
+ ScopedUtfChars chars(env, jString);
+ return string(chars.c_str());
+}
+
+static void loadIcuData(string icuPath) {
+ void* addr = mmapFile(icuPath.c_str());
+ UErrorCode err = U_ZERO_ERROR;
+ udata_setCommonData(addr, &err);
+ if (err != U_ZERO_ERROR) {
+ ALOGE("Unable to load ICU data\n");
+ }
+}
+
+// Loads the ICU data file from the location specified in properties.
+// First try specified in the system property ro.icu.data.path,
+// then fallback to java property icu.data.path
static void loadIcuData() {
string icuPath = base::GetProperty("ro.icu.data.path", "");
if (!icuPath.empty()) {
- // Set the location of ICU data
- void* addr = mmapFile(icuPath.c_str());
- UErrorCode err = U_ZERO_ERROR;
- udata_setCommonData(addr, &err);
- if (err != U_ZERO_ERROR) {
- ALOGE("Unable to load ICU data\n");
+ loadIcuData(icuPath);
+ } else {
+ // fallback to read from java.lang.System.getProperty
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
+ string icuPathFromJava = getJavaProperty(env, "icu.data.path");
+ if (!icuPathFromJava.empty()) {
+ loadIcuData(icuPathFromJava);
}
}
}
static int register_android_core_classes(JNIEnv* env) {
- jclass system = FindClassOrDie(env, "java/lang/System");
- jmethodID getPropertyMethod =
- GetStaticMethodIDOrDie(env, system, "getProperty",
- "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
-
- // Get the names of classes that need to register their native methods
- auto nativesClassesJString =
- (jstring)env->CallStaticObjectMethod(system, getPropertyMethod,
- env->NewStringUTF("core_native_classes"),
- env->NewStringUTF(""));
- const char* nativesClassesArray = env->GetStringUTFChars(nativesClassesJString, nullptr);
- string nativesClassesString(nativesClassesArray);
+ string nativesClassesString = getJavaProperty(env, "core_native_classes");
vector<string> classesToRegister = parseCsv(nativesClassesString);
- env->ReleaseStringUTFChars(nativesClassesJString, nativesClassesArray);
if (register_jni_procs(gRegJNIMap, classesToRegister, env) < 0) {
return JNI_ERR;
@@ -360,18 +375,7 @@ void AndroidRuntime::onStarted() {
void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote) {
JNIEnv* env = AndroidRuntime::getJNIEnv();
- jclass system = FindClassOrDie(env, "java/lang/System");
- jmethodID getPropertyMethod =
- GetStaticMethodIDOrDie(env, system, "getProperty",
- "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
-
- auto methodBindingJString =
- (jstring)env->CallStaticObjectMethod(system, getPropertyMethod,
- env->NewStringUTF("method_binding_format"),
- env->NewStringUTF(""));
- const char* methodBindingChars = env->GetStringUTFChars(methodBindingJString, 0);
- auto method_binding_format = string(methodBindingChars);
- env->ReleaseStringUTFChars(methodBindingJString, methodBindingChars);
+ auto method_binding_format = getJavaProperty(env, "method_binding_format");
setJniMethodFormat(method_binding_format);