Index: base/android/jni_android.cc |
diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc |
index a2de00aca2a3fcf2ce0c8c82bd06afc48229c256..1b715dc7d544955ed5bc316d8808b6f35cd141fe 100644 |
--- a/base/android/jni_android.cc |
+++ b/base/android/jni_android.cc |
@@ -159,10 +159,25 @@ const jobject GetApplicationContext() { |
ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env, const char* class_name) { |
jclass clazz; |
if (!g_class_loader.Get().is_null()) { |
+ // ClassLoader.loadClass expects a classname with components separated by |
+ // dots instead of the slashes that JNIEnv::FindClass expects. The JNI |
+ // generator generates names with slashes, so we have to replace them here. |
+ // TODO(torne): move to an approach where we always use ClassLoader except |
+ // for the special case of base::android::GetClassLoader(), and change the |
+ // JNI generator to generate dot-separated names. http://crbug.com/461773 |
+ size_t bufsize = strlen(class_name) + 1; |
+ char dotted_name[bufsize]; |
+ memmove(dotted_name, class_name, bufsize); |
+ for (size_t i = 0; i < bufsize; ++i) { |
+ if (dotted_name[i] == '/') { |
+ dotted_name[i] = '.'; |
+ } |
+ } |
+ |
clazz = static_cast<jclass>( |
env->CallObjectMethod(g_class_loader.Get().obj(), |
g_class_loader_load_class_method_id, |
- ConvertUTF8ToJavaString(env, class_name).obj())); |
+ ConvertUTF8ToJavaString(env, dotted_name).obj())); |
} else { |
clazz = env->FindClass(class_name); |
} |