blob: c6abe537412c2728ad792da06c8a9db980700a61 [file] [log] [blame]
Brian Carlstromf867b6f2011-09-16 12:17:25 -07001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "jni_internal.h"
18#include "class_linker.h"
19#include "object.h"
20
21#include "JniConstants.h" // Last to avoid problems with LOG redefinition.
22
23namespace art {
24
25namespace {
26
27jint Field_getFieldModifiers(JNIEnv* env, jobject jfield, jclass javaDeclaringClass, jint slot) {
28 return Decode<Object*>(env, jfield)->AsField()->GetAccessFlags() & kAccFieldFlagsMask;
29}
30
Elliott Hughes33203b52011-09-20 19:42:01 -070031// TODO: we'll need this for Method too.
32bool VerifyObjectInClass(JNIEnv* env, Object* o, Class* c) {
33 if (o == NULL) {
34 jniThrowNullPointerException(env, "receiver for non-static field access was null");
35 return false;
36 }
37 if (!o->InstanceOf(c)) {
38 std::string expectedClassName(PrettyDescriptor(c->GetDescriptor()));
39 std::string actualClassName(PrettyTypeOf(o));
40 jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException",
41 "expected receiver of type %s, but got %s",
42 expectedClassName.c_str(), actualClassName.c_str());
43 return false;
44 }
45 return true;
46}
47
48/*
49 * Convert primitive, boxed data from "srcPtr" to "dstPtr".
50 *
51 * Section v2 2.6 lists the various conversions and promotions. We
52 * allow the "widening" and "identity" conversions, but don't allow the
53 * "narrowing" conversions.
54 *
55 * Allowed:
56 * byte to short, int, long, float, double
57 * short to int, long, float double
58 * char to int, long, float, double
59 * int to long, float, double
60 * long to float, double
61 * float to double
62 * Values of types byte, char, and short are "internally" widened to int.
63 *
64 * Returns the width in 32-bit words of the destination primitive, or
65 * -1 if the conversion is not allowed.
66 */
67bool ConvertPrimitiveValue(Class* src_class, Class* dst_class, const JValue& src, JValue& dst) {
68 Class::PrimitiveType srcType = src_class->GetPrimitiveType();
69 Class::PrimitiveType dstType = dst_class->GetPrimitiveType();
70 switch (dstType) {
71 case Class::kPrimBoolean:
72 case Class::kPrimChar:
73 case Class::kPrimByte:
74 if (srcType == dstType) {
75 dst.i = src.i;
76 return true;
77 }
78 break;
79 case Class::kPrimShort:
80 if (srcType == Class::kPrimByte || srcType == Class::kPrimShort) {
81 dst.i = src.i;
82 return true;
83 }
84 break;
85 case Class::kPrimInt:
86 if (srcType == Class::kPrimByte || srcType == Class::kPrimChar ||
87 srcType == Class::kPrimShort || srcType == Class::kPrimInt) {
88 dst.i = src.i;
89 return true;
90 }
91 break;
92 case Class::kPrimLong:
93 if (srcType == Class::kPrimByte || srcType == Class::kPrimChar ||
94 srcType == Class::kPrimShort || srcType == Class::kPrimInt) {
95 dst.j = src.i;
96 return true;
97 } else if (srcType == Class::kPrimLong) {
98 dst.j = src.j;
99 return true;
100 }
101 break;
102 case Class::kPrimFloat:
103 if (srcType == Class::kPrimByte || srcType == Class::kPrimChar ||
104 srcType == Class::kPrimShort || srcType == Class::kPrimInt) {
105 dst.f = src.i;
106 return true;
107 } else if (srcType == Class::kPrimLong) {
108 dst.f = src.j;
109 return true;
110 } else if (srcType == Class::kPrimFloat) {
111 dst.i = src.i;
112 return true;
113 }
114 break;
115 case Class::kPrimDouble:
116 if (srcType == Class::kPrimByte || srcType == Class::kPrimChar ||
117 srcType == Class::kPrimShort || srcType == Class::kPrimInt) {
118 dst.d = src.i;
119 return true;
120 } else if (srcType == Class::kPrimLong) {
121 dst.d = src.j;
122 return true;
123 } else if (srcType == Class::kPrimFloat) {
124 dst.d = src.f;
125 return true;
126 } else if (srcType == Class::kPrimDouble) {
127 dst.j = src.j;
128 return true;
129 }
130 break;
131 default:
132 break;
133 }
134 Thread::Current()->ThrowNewException("Ljava/lang/IllegalArgumentException;",
135 "invalid primitive conversion from %s to %s",
136 PrettyDescriptor(src_class->GetDescriptor()).c_str(),
137 PrettyDescriptor(dst_class->GetDescriptor()).c_str());
138 return false;
139}
140
141bool UnboxPrimitive(JNIEnv* env, Object* o, Class* dst_class, JValue& unboxed_value) {
142 if (dst_class->GetPrimitiveType() == Class::kPrimNot) {
143 if (o != NULL && !o->InstanceOf(dst_class)) {
144 jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException",
145 "expected object of type %s, but got %s",
146 PrettyDescriptor(dst_class->GetDescriptor()).c_str(),
147 PrettyTypeOf(o).c_str());
148 return false;
149 }
150 unboxed_value.l = o;
151 return true;
152 } else if (dst_class->GetPrimitiveType() == Class::kPrimVoid) {
153 Thread::Current()->ThrowNewException("Ljava/lang/IllegalArgumentException;",
154 "can't unbox to void");
155 return false;
156 }
157
158 if (o == NULL) {
159 Thread::Current()->ThrowNewException("Ljava/lang/IllegalArgumentException;",
160 "null passed for boxed primitive type");
161 return false;
162 }
163
164 JValue boxed_value = { 0 };
165 const String* src_descriptor = o->GetClass()->GetDescriptor();
166 Class* src_class = NULL;
167 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
168 Field* primitive_field = o->GetClass()->GetIFields()->Get(0);
169 if (src_descriptor->Equals("Ljava/lang/Boolean;")) {
170 src_class = class_linker->FindPrimitiveClass('Z');
171 boxed_value.z = primitive_field->GetBoolean(o);
172 } else if (src_descriptor->Equals("Ljava/lang/Byte;")) {
173 src_class = class_linker->FindPrimitiveClass('B');
174 boxed_value.b = primitive_field->GetByte(o);
175 } else if (src_descriptor->Equals("Ljava/lang/Character;")) {
176 src_class = class_linker->FindPrimitiveClass('C');
177 boxed_value.c = primitive_field->GetChar(o);
178 } else if (src_descriptor->Equals("Ljava/lang/Float;")) {
179 src_class = class_linker->FindPrimitiveClass('F');
180 boxed_value.f = primitive_field->GetFloat(o);
181 } else if (src_descriptor->Equals("Ljava/lang/Double;")) {
182 src_class = class_linker->FindPrimitiveClass('D');
183 boxed_value.d = primitive_field->GetDouble(o);
184 } else if (src_descriptor->Equals("Ljava/lang/Integer;")) {
185 src_class = class_linker->FindPrimitiveClass('I');
186 boxed_value.i = primitive_field->GetInt(o);
187 } else if (src_descriptor->Equals("Ljava/lang/Long;")) {
188 src_class = class_linker->FindPrimitiveClass('J');
189 boxed_value.j = primitive_field->GetLong(o);
190 } else if (src_descriptor->Equals("Ljava/lang/Short;")) {
191 src_class = class_linker->FindPrimitiveClass('S');
192 boxed_value.s = primitive_field->GetShort(o);
193 } else {
194 Thread::Current()->ThrowNewException("Ljava/lang/IllegalArgumentException;",
195 "%s is not a boxed primitive type", PrettyDescriptor(src_descriptor).c_str());
196 return false;
197 }
198
199 return ConvertPrimitiveValue(src_class, dst_class, boxed_value, unboxed_value);
200}
201
202Method* gBoolean_valueOf;
203Method* gByte_valueOf;
204Method* gCharacter_valueOf;
205Method* gDouble_valueOf;
206Method* gFloat_valueOf;
207Method* gInteger_valueOf;
208Method* gLong_valueOf;
209Method* gShort_valueOf;
210
Elliott Hughesfea966e2011-09-22 10:26:20 -0700211void InitBoxingMethod(JNIEnv* env, Method*& m, jclass c, const char* method_signature) {
212 m = DecodeMethod(env->GetStaticMethodID(c, "valueOf", method_signature));
Elliott Hughes33203b52011-09-20 19:42:01 -0700213}
214
215void BoxPrimitive(JNIEnv* env, Class* src_class, JValue& value) {
216 if (!src_class->IsPrimitive()) {
217 return;
218 }
219
220 Method* m = NULL;
221 UniquePtr<byte[]> args(new byte[8]);
222 memset(&args[0], 0, 8);
223 switch (src_class->GetPrimitiveType()) {
224 case Class::kPrimBoolean:
225 m = gBoolean_valueOf;
226 *reinterpret_cast<uint32_t*>(&args[0]) = value.z;
227 break;
228 case Class::kPrimByte:
229 m = gByte_valueOf;
230 *reinterpret_cast<uint32_t*>(&args[0]) = value.b;
231 break;
232 case Class::kPrimChar:
233 m = gCharacter_valueOf;
234 *reinterpret_cast<uint32_t*>(&args[0]) = value.c;
235 break;
236 case Class::kPrimDouble:
237 m = gDouble_valueOf;
238 *reinterpret_cast<double*>(&args[0]) = value.d;
239 break;
240 case Class::kPrimFloat:
241 m = gFloat_valueOf;
242 *reinterpret_cast<float*>(&args[0]) = value.f;
243 break;
244 case Class::kPrimInt:
245 m = gInteger_valueOf;
246 *reinterpret_cast<uint32_t*>(&args[0]) = value.i;
247 break;
248 case Class::kPrimLong:
249 m = gLong_valueOf;
250 *reinterpret_cast<uint64_t*>(&args[0]) = value.j;
251 break;
252 case Class::kPrimShort:
253 m = gShort_valueOf;
254 *reinterpret_cast<uint32_t*>(&args[0]) = value.s;
255 break;
256 default:
257 LOG(FATAL) << PrettyClass(src_class);
258 }
259
260 Thread* self = Thread::Current();
261 ScopedThreadStateChange tsc(self, Thread::kRunnable);
262 m->Invoke(self, NULL, args.get(), &value);
263}
264
265bool GetFieldValue(Object* o, Field* f, JValue& value, bool allow_references) {
266 switch (f->GetType()->GetPrimitiveType()) {
267 case Class::kPrimBoolean:
268 value.z = f->GetBoolean(o);
269 return true;
270 case Class::kPrimByte:
271 value.b = f->GetByte(o);
272 return true;
273 case Class::kPrimChar:
274 value.c = f->GetChar(o);
275 return true;
276 case Class::kPrimDouble:
277 value.d = f->GetDouble(o);
278 return true;
279 case Class::kPrimFloat:
280 value.f = f->GetFloat(o);
281 return true;
282 case Class::kPrimInt:
283 value.i = f->GetInt(o);
284 return true;
285 case Class::kPrimLong:
286 value.j = f->GetLong(o);
287 return true;
288 case Class::kPrimShort:
289 value.s = f->GetShort(o);
290 return true;
291 case Class::kPrimNot:
292 if (allow_references) {
293 value.l = f->GetObject(o);
294 return true;
295 }
296 // Else break to report an error.
297 break;
298 case Class::kPrimVoid:
299 // Never okay.
300 break;
301 }
302 Thread::Current()->ThrowNewException("Ljava/lang/IllegalArgumentException;",
303 "Not a primitive field: %s", PrettyField(f).c_str());
304 return false;
305}
306
307JValue GetPrimitiveField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jchar targetDescriptor) {
308 Field* f = reinterpret_cast<Field*>(env->FromReflectedField(javaField));
309
310 // Check that the receiver is non-null and an instance of the field's declaring class.
311 Object* o = Decode<Object*>(env, javaObj);
312 bool isStatic = (javaObj == NULL);
313 if (!isStatic) {
314 Class* declaringClass = Decode<Class*>(env, javaDeclaringClass);
315 if (!VerifyObjectInClass(env, o, declaringClass)) {
316 return JValue();
317 }
318 }
319
320 // Read the value.
321 JValue field_value;
322 if (!GetFieldValue(o, f, field_value, false)) {
323 return JValue();
324 }
325
326 // Widen it if necessary (and possible).
327 JValue wide_value;
328 Class* targetType = Runtime::Current()->GetClassLinker()->FindPrimitiveClass(targetDescriptor);
329 if (!ConvertPrimitiveValue(f->GetType(), targetType, field_value, wide_value)) {
330 return JValue();
331 }
332 return wide_value;
333}
334
335jbyte Field_getBField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
336 return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).b;
337}
338
339jchar Field_getCField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
340 return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).c;
341}
342
343jdouble Field_getDField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
344 return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).d;
345}
346
347jfloat Field_getFField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
348 return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).f;
349}
350
351jint Field_getIField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
352 return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).i;
353}
354
355jlong Field_getJField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
356 return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).j;
357}
358
359jshort Field_getSField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
360 return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).s;
361}
362
363jboolean Field_getZField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor) {
364 return GetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor).z;
365}
366
367void SetFieldValue(Object* o, Field* f, const JValue& new_value, bool allow_references) {
368 switch (f->GetType()->GetPrimitiveType()) {
369 case Class::kPrimBoolean:
370 f->SetBoolean(o, new_value.z);
371 return;
372 case Class::kPrimByte:
373 f->SetByte(o, new_value.b);
374 return;
375 case Class::kPrimChar:
376 f->SetChar(o, new_value.c);
377 return;
378 case Class::kPrimDouble:
379 f->SetDouble(o, new_value.d);
380 return;
381 case Class::kPrimFloat:
382 f->SetFloat(o, new_value.f);
383 return;
384 case Class::kPrimInt:
385 f->SetInt(o, new_value.i);
386 return;
387 case Class::kPrimLong:
388 f->SetLong(o, new_value.j);
389 return;
390 case Class::kPrimShort:
391 f->SetShort(o, new_value.s);
392 return;
393 case Class::kPrimNot:
394 if (allow_references) {
395 f->SetObject(o, new_value.l);
396 return;
397 }
398 // Else break to report an error.
399 break;
400 case Class::kPrimVoid:
401 // Never okay.
402 break;
403 }
404 Thread::Current()->ThrowNewException("Ljava/lang/IllegalArgumentException;",
405 "Not a primitive field: %s", PrettyField(f).c_str());
406}
407
408void SetPrimitiveField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jchar targetDescriptor, const JValue& new_value) {
409 Field* f = reinterpret_cast<Field*>(env->FromReflectedField(javaField));
410
411 // Check that the receiver is non-null and an instance of the field's declaring class.
412 Object* o = Decode<Object*>(env, javaObj);
413 bool isStatic = (javaObj == NULL);
414 if (!isStatic) {
415 Class* declaringClass = Decode<Class*>(env, javaDeclaringClass);
416 if (!VerifyObjectInClass(env, o, declaringClass)) {
417 return;
418 }
419 }
420
421 // Widen the value if necessary (and possible).
422 JValue wide_value;
423 Class* targetType = Runtime::Current()->GetClassLinker()->FindPrimitiveClass(targetDescriptor);
424 if (!ConvertPrimitiveValue(f->GetType(), targetType, new_value, wide_value)) {
425 return;
426 }
427
428 // Write the value.
429 SetFieldValue(o, f, wide_value, false);
430}
431
432void Field_setBField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jbyte value) {
433 JValue v = { 0 };
434 v.b = value;
435 SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
436}
437
438void Field_setCField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jchar value) {
439 JValue v = { 0 };
440 v.c = value;
441 SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
442}
443
444void Field_setDField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jdouble value) {
445 JValue v = { 0 };
446 v.d = value;
447 SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
448}
449
450void Field_setFField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jfloat value) {
451 JValue v = { 0 };
452 v.f = value;
453 SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
454}
455
456void Field_setIField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jint value) {
457 JValue v = { 0 };
458 v.i = value;
459 SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
460}
461
462void Field_setJField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jlong value) {
463 JValue v = { 0 };
464 v.j = value;
465 SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
466}
467
468void Field_setSField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jshort value) {
469 JValue v = { 0 };
470 v.s = value;
471 SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
472}
473
474void Field_setZField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jchar targetDescriptor, jboolean value) {
475 JValue v = { 0 };
476 v.z = value;
477 SetPrimitiveField(env, javaField, javaObj, javaDeclaringClass, targetDescriptor, v);
478}
479
480void Field_setField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean, jobject javaValue) {
481 Field* f = reinterpret_cast<Field*>(env->FromReflectedField(javaField));
482
483 // Unbox the value, if necessary.
484 Object* boxed_value = Decode<Object*>(env, javaValue);
485 JValue unboxed_value;
486 if (!UnboxPrimitive(env, boxed_value, f->GetType(), unboxed_value)) {
487 return;
488 }
489
490 // Check that the receiver is non-null and an instance of the field's declaring class.
491 Object* o = Decode<Object*>(env, javaObj);
492 bool isStatic = (javaObj == NULL);
493 if (!isStatic) {
494 Class* declaringClass = Decode<Class*>(env, javaDeclaringClass);
495 if (!VerifyObjectInClass(env, o, declaringClass)) {
496 return;
497 }
498 }
499
500 SetFieldValue(o, f, unboxed_value, true);
501}
502
503jobject Field_getField(JNIEnv* env, jobject javaField, jobject javaObj, jclass javaDeclaringClass, jclass, jint, jboolean) {
504 Field* f = reinterpret_cast<Field*>(env->FromReflectedField(javaField));
505
506 // Check that the receiver is non-null and an instance of the field's declaring class.
507 Object* o = Decode<Object*>(env, javaObj);
508 bool isStatic = (javaObj == NULL);
509 if (!isStatic) {
510 Class* declaringClass = Decode<Class*>(env, javaDeclaringClass);
511 if (!VerifyObjectInClass(env, o, declaringClass)) {
512 return NULL;
513 }
514 }
515
516 // Get the field's value, boxing if necessary.
517 JValue value;
518 if (!GetFieldValue(o, f, value, true)) {
519 return NULL;
520 }
521 BoxPrimitive(env, f->GetType(), value);
522
523 return AddLocalReference<jobject>(env, value.l);
524}
525
Brian Carlstromf867b6f2011-09-16 12:17:25 -0700526static JNINativeMethod gMethods[] = {
Elliott Hughes33203b52011-09-20 19:42:01 -0700527 NATIVE_METHOD(Field, getFieldModifiers, "(Ljava/lang/Class;I)I"),
528
529 NATIVE_METHOD(Field, getBField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)B"),
530 NATIVE_METHOD(Field, getCField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)C"),
531 NATIVE_METHOD(Field, getDField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)D"),
532 NATIVE_METHOD(Field, getFField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)F"),
533 NATIVE_METHOD(Field, getField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZ)Ljava/lang/Object;"),
534 NATIVE_METHOD(Field, getIField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)I"),
535 NATIVE_METHOD(Field, getJField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)J"),
536 NATIVE_METHOD(Field, getSField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)S"),
537 NATIVE_METHOD(Field, getZField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)Z"),
538 NATIVE_METHOD(Field, setBField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCB)V"),
539 NATIVE_METHOD(Field, setCField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCC)V"),
540 NATIVE_METHOD(Field, setDField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCD)V"),
541 NATIVE_METHOD(Field, setFField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCF)V"),
542 NATIVE_METHOD(Field, setField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZLjava/lang/Object;)V"),
543 NATIVE_METHOD(Field, setIField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCI)V"),
544 NATIVE_METHOD(Field, setJField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCJ)V"),
545 NATIVE_METHOD(Field, setSField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCS)V"),
546 NATIVE_METHOD(Field, setZField, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCZ)V"),
Brian Carlstromf867b6f2011-09-16 12:17:25 -0700547};
548
549} // namespace
550
551void register_java_lang_reflect_Field(JNIEnv* env) {
Elliott Hughesfea966e2011-09-22 10:26:20 -0700552 InitBoxingMethod(env, gBoolean_valueOf, JniConstants::booleanClass, "(Z)Ljava/lang/Boolean;");
553 InitBoxingMethod(env, gByte_valueOf, JniConstants::byteClass, "(B)Ljava/lang/Byte;");
554 InitBoxingMethod(env, gCharacter_valueOf, JniConstants::characterClass, "(C)Ljava/lang/Character;");
555 InitBoxingMethod(env, gDouble_valueOf, JniConstants::doubleClass, "(D)Ljava/lang/Double;");
556 InitBoxingMethod(env, gFloat_valueOf, JniConstants::floatClass, "(F)Ljava/lang/Float;");
557 InitBoxingMethod(env, gInteger_valueOf, JniConstants::integerClass, "(I)Ljava/lang/Integer;");
558 InitBoxingMethod(env, gLong_valueOf, JniConstants::longClass, "(J)Ljava/lang/Long;");
559 InitBoxingMethod(env, gShort_valueOf, JniConstants::shortClass, "(S)Ljava/lang/Short;");
Brian Carlstromf867b6f2011-09-16 12:17:25 -0700560 jniRegisterNativeMethods(env, "java/lang/reflect/Field", gMethods, NELEM(gMethods));
561}
562
563} // namespace art