Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(300)

Side by Side Diff: content/browser/renderer_host/java/java_method.cc

Issue 8659007: Add support for calling static methods in the Java Bridge (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix use of LAZY_INSTANCE_INITIALIZER Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/java/java_method.h" 5 #include "content/browser/renderer_host/java/java_method.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h" 8 #include "base/android/jni_string.h"
9 #include "base/lazy_instance.h"
9 #include "base/memory/singleton.h" 10 #include "base/memory/singleton.h"
10 #include "base/string_util.h" // For ReplaceSubstringsAfterOffset 11 #include "base/string_util.h" // For ReplaceSubstringsAfterOffset
11 12
12 using base::android::AttachCurrentThread; 13 using base::android::AttachCurrentThread;
13 using base::android::ConvertJavaStringToUTF8; 14 using base::android::ConvertJavaStringToUTF8;
15 using base::android::GetMethodID;
14 using base::android::GetMethodIDFromClassName; 16 using base::android::GetMethodIDFromClassName;
17 using base::android::GetStaticMethodID;
18 using base::android::ScopedJavaGlobalRef;
15 using base::android::ScopedJavaLocalRef; 19 using base::android::ScopedJavaLocalRef;
16 20
17 namespace { 21 namespace {
18 22
19 const char kGetName[] = "getName"; 23 const char kGetName[] = "getName";
20 const char kGetDeclaringClass[] = "getDeclaringClass"; 24 const char kGetDeclaringClass[] = "getDeclaringClass";
25 const char kGetModifiers[] = "getModifiers";
21 const char kGetParameterTypes[] = "getParameterTypes"; 26 const char kGetParameterTypes[] = "getParameterTypes";
22 const char kGetReturnType[] = "getReturnType"; 27 const char kGetReturnType[] = "getReturnType";
28 const char kIntegerReturningBoolean[] = "(I)Z";
29 const char kIsStatic[] = "isStatic";
23 const char kJavaLangClass[] = "java/lang/Class"; 30 const char kJavaLangClass[] = "java/lang/Class";
24 const char kJavaLangReflectMethod[] = "java/lang/reflect/Method"; 31 const char kJavaLangReflectMethod[] = "java/lang/reflect/Method";
32 const char kJavaLangReflectModifier[] = "java/lang/reflect/Modifier";
33 const char kReturningInteger[] = "()I";
25 const char kReturningJavaLangClass[] = "()Ljava/lang/Class;"; 34 const char kReturningJavaLangClass[] = "()Ljava/lang/Class;";
26 const char kReturningJavaLangClassArray[] = "()[Ljava/lang/Class;"; 35 const char kReturningJavaLangClassArray[] = "()[Ljava/lang/Class;";
27 const char kReturningJavaLangString[] = "()Ljava/lang/String;"; 36 const char kReturningJavaLangString[] = "()Ljava/lang/String;";
28 37
38 struct ModifierClassTraits :
39 public base::DefaultLazyInstanceTraits<ScopedJavaGlobalRef<jclass> > {
40 static ScopedJavaGlobalRef<jclass>* New(void* instance) {
41 JNIEnv* env = AttachCurrentThread();
42 // Use placement new to initialize our instance in our preallocated space.
43 // The parenthesis is very important here to force POD type initialization.
joth 2011/12/05 15:53:23 this sentence not needed here. (we already know Sc
44 return new (instance) ScopedJavaGlobalRef<jclass>(
45 ScopedJavaLocalRef<jclass>(
46 env,
47 static_cast<jclass>(env->FindClass(kJavaLangReflectModifier))));
48 }
49 };
50
51 base::LazyInstance<ScopedJavaGlobalRef<jclass>, ModifierClassTraits>
52 g_java_lang_reflect_modifier_class = LAZY_INSTANCE_INITIALIZER;
53
29 std::string BinaryNameToJNIName(const std::string& binary_name, 54 std::string BinaryNameToJNIName(const std::string& binary_name,
30 JavaType* type) { 55 JavaType* type) {
31 DCHECK(type); 56 DCHECK(type);
32 *type = JavaType::CreateFromBinaryName(binary_name); 57 *type = JavaType::CreateFromBinaryName(binary_name);
33 switch (type->type) { 58 switch (type->type) {
34 case JavaType::TypeBoolean: 59 case JavaType::TypeBoolean:
35 return "Z"; 60 return "Z";
36 case JavaType::TypeByte: 61 case JavaType::TypeByte:
37 return "B"; 62 return "B";
38 case JavaType::TypeChar: 63 case JavaType::TypeChar:
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 kReturningJavaLangClass)))); 195 kReturningJavaLangClass))));
171 ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>( 196 ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>(
172 env->CallObjectMethod(clazz.obj(), GetMethodIDFromClassName( 197 env->CallObjectMethod(clazz.obj(), GetMethodIDFromClassName(
173 env, 198 env,
174 kJavaLangClass, 199 kJavaLangClass,
175 kGetName, 200 kGetName,
176 kReturningJavaLangString)))); 201 kReturningJavaLangString))));
177 signature += BinaryNameToJNIName(ConvertJavaStringToUTF8(env, name.obj()), 202 signature += BinaryNameToJNIName(ConvertJavaStringToUTF8(env, name.obj()),
178 &return_type_); 203 &return_type_);
179 204
205 // Determine whether the method is static.
206 jint modifiers = env->CallIntMethod(
207 java_method_.obj(), GetMethodIDFromClassName(env,
208 kJavaLangReflectMethod,
209 kGetModifiers,
210 kReturningInteger));
211 bool is_static = env->CallStaticBooleanMethod(
212 g_java_lang_reflect_modifier_class.Pointer()->obj(),
joth 2011/12/05 15:53:23 nit: g_java_lang_reflect_modifier_class.Get().obj(
213 GetMethodIDFromClassName(env,
214 kJavaLangReflectModifier,
215 kIsStatic,
216 kIntegerReturningBoolean),
217 modifiers);
218
180 // Get the ID for this method. 219 // Get the ID for this method.
181 ScopedJavaLocalRef<jclass> declaring_class(env, static_cast<jclass>( 220 ScopedJavaLocalRef<jclass> declaring_class(env, static_cast<jclass>(
182 env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName( 221 env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName(
183 env, 222 env,
184 kJavaLangReflectMethod, 223 kJavaLangReflectMethod,
185 kGetDeclaringClass, 224 kGetDeclaringClass,
186 kReturningJavaLangClass)))); 225 kReturningJavaLangClass))));
187 id_ = base::android::GetMethodID(env, declaring_class.obj(), name_.c_str(), 226 id_ = is_static ?
188 signature.c_str()); 227 GetStaticMethodID(env, declaring_class.obj(), name_.c_str(),
228 signature.c_str()) :
229 GetMethodID(env, declaring_class.obj(), name_.c_str(),
230 signature.c_str());
189 231
190 java_method_.Reset(); 232 java_method_.Reset();
191 } 233 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698