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

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

Issue 393733002: [Android] Check for Java object types covariance in Java Bridge (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Updated findbugs_known_bugs Created 6 years, 5 months 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/android/java/java_method.h" 5 #include "content/browser/android/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/lazy_instance.h"
10 #include "base/memory/singleton.h" 10 #include "base/memory/singleton.h"
11 #include "base/strings/string_util.h" // For ReplaceSubstringsAfterOffset
12 #include "content/browser/android/java/jni_helper.h" 11 #include "content/browser/android/java/jni_helper.h"
13 12
14 using base::android::AttachCurrentThread; 13 using base::android::AttachCurrentThread;
15 using base::android::ConvertJavaStringToUTF8; 14 using base::android::ConvertJavaStringToUTF8;
16 using base::android::GetClass; 15 using base::android::GetClass;
17 using base::android::MethodID; 16 using base::android::MethodID;
18 using base::android::ScopedJavaGlobalRef; 17 using base::android::ScopedJavaGlobalRef;
19 using base::android::ScopedJavaLocalRef; 18 using base::android::ScopedJavaLocalRef;
20 19
21 namespace content { 20 namespace content {
(...skipping 21 matching lines...) Expand all
43 JNIEnv* env = AttachCurrentThread(); 42 JNIEnv* env = AttachCurrentThread();
44 // Use placement new to initialize our instance in our preallocated space. 43 // Use placement new to initialize our instance in our preallocated space.
45 return new (instance) ScopedJavaGlobalRef<jclass>( 44 return new (instance) ScopedJavaGlobalRef<jclass>(
46 GetClass(env, kJavaLangReflectModifier)); 45 GetClass(env, kJavaLangReflectModifier));
47 } 46 }
48 }; 47 };
49 48
50 base::LazyInstance<ScopedJavaGlobalRef<jclass>, ModifierClassTraits> 49 base::LazyInstance<ScopedJavaGlobalRef<jclass>, ModifierClassTraits>
51 g_java_lang_reflect_modifier_class = LAZY_INSTANCE_INITIALIZER; 50 g_java_lang_reflect_modifier_class = LAZY_INSTANCE_INITIALIZER;
52 51
53 std::string BinaryNameToJNIName(const std::string& binary_name, 52 std::string BinaryNameToJNISignature(const std::string& binary_name,
54 JavaType* type) { 53 JavaType* type) {
55 DCHECK(type); 54 DCHECK(type);
56 *type = JavaType::CreateFromBinaryName(binary_name); 55 *type = JavaType::CreateFromBinaryName(binary_name);
57 switch (type->type) { 56 return type->JNISignature();
58 case JavaType::TypeBoolean:
59 return "Z";
60 case JavaType::TypeByte:
61 return "B";
62 case JavaType::TypeChar:
63 return "C";
64 case JavaType::TypeShort:
65 return "S";
66 case JavaType::TypeInt:
67 return "I";
68 case JavaType::TypeLong:
69 return "J";
70 case JavaType::TypeFloat:
71 return "F";
72 case JavaType::TypeDouble:
73 return "D";
74 case JavaType::TypeVoid:
75 return "V";
76 case JavaType::TypeArray: {
77 // For array types, the binary name uses the JNI name encodings.
78 std::string jni_name = binary_name;
79 ReplaceSubstringsAfterOffset(&jni_name, 0, ".", "/");
80 return jni_name;
81 }
82 case JavaType::TypeString:
83 case JavaType::TypeObject:
84 std::string jni_name = "L" + binary_name + ";";
85 ReplaceSubstringsAfterOffset(&jni_name, 0, ".", "/");
86 return jni_name;
87 }
88 NOTREACHED();
89 return std::string();
90 } 57 }
91 58
92 } // namespace 59 } // namespace
93 60
94 JavaMethod::JavaMethod(const base::android::JavaRef<jobject>& method) 61 JavaMethod::JavaMethod(const base::android::JavaRef<jobject>& method)
95 : java_method_(method), 62 : java_method_(method),
96 have_calculated_num_parameters_(false), 63 have_calculated_num_parameters_(false),
97 id_(NULL) { 64 id_(NULL) {
98 JNIEnv* env = AttachCurrentThread(); 65 JNIEnv* env = AttachCurrentThread();
99 // On construction, we do nothing except get the name. Everything else is 66 // On construction, we do nothing except get the name. Everything else is
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 for (size_t i = 0; i < num_parameters_; ++i) { 151 for (size_t i = 0; i < num_parameters_; ++i) {
185 ScopedJavaLocalRef<jobject> parameter(env, env->GetObjectArrayElement( 152 ScopedJavaLocalRef<jobject> parameter(env, env->GetObjectArrayElement(
186 parameters.obj(), i)); 153 parameters.obj(), i));
187 ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>( 154 ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>(
188 env->CallObjectMethod(parameter.obj(), GetMethodIDFromClassName( 155 env->CallObjectMethod(parameter.obj(), GetMethodIDFromClassName(
189 env, 156 env,
190 kJavaLangClass, 157 kJavaLangClass,
191 kGetName, 158 kGetName,
192 kReturningJavaLangString)))); 159 kReturningJavaLangString))));
193 std::string name_utf8 = ConvertJavaStringToUTF8(name); 160 std::string name_utf8 = ConvertJavaStringToUTF8(name);
194 signature += BinaryNameToJNIName(name_utf8, &parameter_types_[i]); 161 signature += BinaryNameToJNISignature(name_utf8, &parameter_types_[i]);
195 } 162 }
196 signature += ")"; 163 signature += ")";
197 164
198 // Get the return type 165 // Get the return type
199 ScopedJavaLocalRef<jclass> clazz(env, static_cast<jclass>( 166 ScopedJavaLocalRef<jclass> clazz(env, static_cast<jclass>(
200 env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName( 167 env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName(
201 env, 168 env,
202 kJavaLangReflectMethod, 169 kJavaLangReflectMethod,
203 kGetReturnType, 170 kGetReturnType,
204 kReturningJavaLangClass)))); 171 kReturningJavaLangClass))));
205 ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>( 172 ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>(
206 env->CallObjectMethod(clazz.obj(), GetMethodIDFromClassName( 173 env->CallObjectMethod(clazz.obj(), GetMethodIDFromClassName(
207 env, 174 env,
208 kJavaLangClass, 175 kJavaLangClass,
209 kGetName, 176 kGetName,
210 kReturningJavaLangString)))); 177 kReturningJavaLangString))));
211 signature += BinaryNameToJNIName(ConvertJavaStringToUTF8(name), 178 signature += BinaryNameToJNISignature(ConvertJavaStringToUTF8(name),
212 &return_type_); 179 &return_type_);
213 180
214 // Determine whether the method is static. 181 // Determine whether the method is static.
215 jint modifiers = env->CallIntMethod( 182 jint modifiers = env->CallIntMethod(
216 java_method_.obj(), GetMethodIDFromClassName(env, 183 java_method_.obj(), GetMethodIDFromClassName(env,
217 kJavaLangReflectMethod, 184 kJavaLangReflectMethod,
218 kGetModifiers, 185 kGetModifiers,
219 kReturningInteger)); 186 kReturningInteger));
220 is_static_ = env->CallStaticBooleanMethod( 187 is_static_ = env->CallStaticBooleanMethod(
221 g_java_lang_reflect_modifier_class.Get().obj(), 188 g_java_lang_reflect_modifier_class.Get().obj(),
222 MethodID::Get<MethodID::TYPE_STATIC>( 189 MethodID::Get<MethodID::TYPE_STATIC>(
(...skipping 10 matching lines...) Expand all
233 kReturningJavaLangClass)))); 200 kReturningJavaLangClass))));
234 id_ = is_static_ ? 201 id_ = is_static_ ?
235 MethodID::Get<MethodID::TYPE_STATIC>( 202 MethodID::Get<MethodID::TYPE_STATIC>(
236 env, declaring_class.obj(), name_.c_str(), signature.c_str()) : 203 env, declaring_class.obj(), name_.c_str(), signature.c_str()) :
237 MethodID::Get<MethodID::TYPE_INSTANCE>( 204 MethodID::Get<MethodID::TYPE_INSTANCE>(
238 env, declaring_class.obj(), name_.c_str(), signature.c_str()); 205 env, declaring_class.obj(), name_.c_str(), signature.c_str());
239 java_method_.Reset(); 206 java_method_.Reset();
240 } 207 }
241 208
242 } // namespace content 209 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/android/java/gin_java_script_to_java_types_coercion.cc ('k') | content/browser/android/java/java_type.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698