Chromium Code Reviews| Index: base/android/jni_android.cc |
| diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc |
| index a2de00aca2a3fcf2ce0c8c82bd06afc48229c256..bc3c6e83ac2347b83ce49b008eb640c3be009391 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. |
|
rmcilroy
2015/03/16 18:13:16
nit - please link to the bug here.
Torne
2015/03/16 20:53:29
Done.
|
| + 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) { |
|
rmcilroy
2015/03/16 18:13:16
spaces between '=' and '<' operators.
Torne
2015/03/16 20:53:30
Done.
|
| + 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); |
| } |