| /* //device/libs/android_runtime/BindTest.cpp |
| ** |
| ** Copyright 2006, The Android Open Source Project |
| ** |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <jam-public.h> |
| |
| static u4 offset_instanceString; |
| static FieldBlock *fb_classString = NULL; |
| static Class *class_ReturnedObject = NULL; |
| static MethodBlock *mb_ReturnedObject_setReturnedString = NULL; |
| static MethodBlock *mb_Java_Lang_Object_Equals = NULL; |
| |
| static u4 offset_mObj; |
| static u4 offset_mBool; |
| static u4 offset_mInt; |
| static u4 offset_mString; |
| static u4 offset_mDouble; |
| static u4 offset_mLong; |
| |
| |
| /* native String getString(); */ |
| static uintptr_t * |
| getString(Class *clazz, MethodBlock *mb, uintptr_t *ostack) |
| { |
| RETURN_OBJ (createString ("String")); |
| } |
| |
| /* native String getNullString(); */ |
| static uintptr_t * |
| getNullString(Class *clazz, MethodBlock *mb, uintptr_t *ostack) |
| { |
| RETURN_OBJ (createString (NULL)); |
| } |
| |
| /* native String getBooleanTrue(); */ |
| static uintptr_t * |
| getBooleanTrue(Class *clazz, MethodBlock *mb, uintptr_t *ostack) |
| { |
| RETURN_BOOLEAN (TRUE); |
| } |
| |
| /* native String getBooleanFalse(); */ |
| static uintptr_t * |
| getBooleanFalse(Class *clazz, MethodBlock *mb, uintptr_t *ostack) |
| { |
| RETURN_BOOLEAN (FALSE); |
| } |
| |
| /* native Object nonvoidThrowsException() */ |
| static uintptr_t * |
| nonvoidThrowsException (Class *clazz, MethodBlock *mb, uintptr_t *ostack) |
| { |
| if (1) { |
| signalException("java/lang/NullPointerException", NULL); |
| goto exception; |
| } |
| |
| RETURN_OBJ (NULL); |
| exception: |
| RETURN_VOID; |
| } |
| |
| /* native void setInstanceString(String s); */ |
| static uintptr_t * |
| setInstanceString (Class *clazz, MethodBlock *mb, uintptr_t *ostack) |
| { |
| Object *jthis = (Object *) ostack[0]; |
| |
| JOBJ_set_obj(jthis, offset_instanceString, ostack[1]); |
| |
| RETURN_VOID; |
| } |
| |
| /* native void setClassString(String s) */ |
| static uintptr_t * |
| setClassString (Class *clazz, MethodBlock *mb, uintptr_t *ostack) |
| { |
| // Object *jthis = (Object *) ostack[0]; |
| |
| fb_classString->static_value = ostack[1]; |
| |
| RETURN_VOID; |
| } |
| |
| /* native String makeStringFromThreeChars(char a, char b, char c); */ |
| static uintptr_t * |
| makeStringFromThreeChars (Class *clazz, MethodBlock *mb, uintptr_t *ostack) |
| { |
| // Object *jthis = ostack[0]; |
| char a = (char) ostack[1]; |
| char b = (char) ostack[2]; |
| char c = (char) ostack[3]; |
| |
| char str[4]; |
| |
| str[0] = a; |
| str[1] = b; |
| str[2] = c; |
| str[3] = 0; |
| |
| RETURN_OBJ(createString(str)); |
| } |
| |
| /* native ReturnedObject makeReturnedObject(String a); */ |
| static uintptr_t * |
| makeReturnedObject (Class *clazz, MethodBlock *mb, uintptr_t *ostack) |
| { |
| //Object *jthis = (Object*)ostack[0]; |
| Object *a = (Object*)ostack[1]; |
| |
| Object *ret; |
| |
| ret = allocObject(class_ReturnedObject); |
| |
| executeMethod(ret, mb_ReturnedObject_setReturnedString, a); |
| |
| RETURN_OBJ (ret); |
| } |
| |
| /* native double addDoubles(double a, double b); */ |
| static uintptr_t * |
| addDoubles (Class *clazz, MethodBlock *mb, uintptr_t *ostack) |
| { |
| //Object *jthis = (Object*)ostack[0]; |
| double a = JARG_get_double(1); |
| double b = JARG_get_double(3); |
| |
| RETURN_DOUBLE(a+b); |
| } |
| |
| /* native void setAll (Object obj, boolean bool, int i, String str, double d, long l) */ |
| static uintptr_t * |
| setAll (Class *clazz, MethodBlock *mb, uintptr_t *ostack) |
| { |
| Object *jthis = JARG_get_obj(0); |
| |
| Object *obj = JARG_get_obj(1); |
| bool b = JARG_get_bool(2); |
| int i = JARG_get_int(3); |
| char *str = JARG_get_cstr_strdup(4); |
| double d = JARG_get_double(5); |
| long long ll = JARG_get_long_long(5+2); |
| |
| JOBJ_set_obj(jthis, offset_mObj, obj); |
| JOBJ_set_bool(jthis, offset_mBool, b); |
| JOBJ_set_int(jthis, offset_mInt, i); |
| JOBJ_set_cstr(jthis, offset_mString, str); |
| free(str); |
| str = NULL; |
| JOBJ_set_double(jthis, offset_mDouble, d); |
| JOBJ_set_long_long(jthis, offset_mLong, ll); |
| |
| RETURN_VOID; |
| } |
| |
| /* native void compareAll (Object obj, boolean bool, int i, String str, double d, long l) */ |
| static uintptr_t * |
| compareAll (Class *clazz, MethodBlock *mb, uintptr_t *ostack) |
| { |
| Object *jthis = JARG_get_obj(0); |
| |
| Object *obj = JARG_get_obj(1); |
| bool b = JARG_get_bool(2); |
| int i = JARG_get_int(3); |
| Object *strObj = JARG_get_obj(4); |
| double d = JARG_get_double(5); |
| long long ll = JARG_get_long_long(5+2); |
| |
| bool ret; |
| |
| void *result; |
| |
| Object *mStringObj = JOBJ_get_obj(jthis, offset_mString); |
| |
| char *s = JARG_get_cstr_strdup(4); |
| |
| result = executeMethod (strObj, lookupVirtualMethod(strObj,mb_Java_Lang_Object_Equals), |
| JOBJ_get_obj(jthis, offset_mString)); |
| |
| if (exceptionOccurred()) { |
| RETURN_VOID; |
| } |
| |
| ret = (*(uintptr_t *)result != 0) |
| && (obj == JOBJ_get_obj(jthis, offset_mObj)) |
| && (b == JOBJ_get_bool(jthis, offset_mBool)) |
| && (i == JOBJ_get_int(jthis, offset_mInt)) |
| && (d == JOBJ_get_double(jthis, offset_mDouble)) |
| && (ll == JOBJ_get_long_long(jthis, offset_mLong)); |
| |
| |
| RETURN_BOOLEAN(ret); |
| } |
| |
| static VMMethod methods[] = { |
| {"getString", getString}, |
| {"getNullString", getNullString}, |
| {"getBooleanTrue", getBooleanTrue}, |
| {"getBooleanFalse", getBooleanFalse}, |
| {"nonvoidThrowsException", nonvoidThrowsException}, |
| {"setInstanceString", setInstanceString}, |
| {"setClassString", setClassString}, |
| {"makeStringFromThreeChars", makeStringFromThreeChars}, |
| {"makeReturnedObject", makeReturnedObject}, |
| {"addDoubles", addDoubles}, |
| {"setAll", setAll}, |
| {"compareAll", compareAll}, |
| {NULL, NULL} |
| }; |
| |
| |
| void register_BindTest() |
| { |
| jamvm_registerClass("BindTest", methods); |
| |
| Class *clazz = NULL; |
| |
| clazz = findClassFromClassLoader("BindTest", getSystemClassLoader()); |
| |
| if (clazz == NULL) { |
| fprintf(stderr, "Error: BindTest not found\n"); |
| clearException(); |
| return; |
| } |
| |
| FieldBlock *fb; |
| |
| fb = findField(clazz, "instanceString", "Ljava/lang/String;"); |
| |
| if (fb == NULL || ((fb->access_flags & ACC_STATIC) == ACC_STATIC)) { |
| fprintf(stderr, "Error: BindTest.instanceString not found or error\n"); |
| return; |
| } |
| |
| offset_instanceString = fb->offset; |
| |
| fb_classString = findField(clazz, "classString", "Ljava/lang/String;"); |
| |
| if (fb_classString == NULL || ((fb_classString->access_flags & ACC_STATIC) != ACC_STATIC)) { |
| fprintf(stderr, "Error: BindTest.classString not found or error\n"); |
| return; |
| } |
| |
| |
| class_ReturnedObject = findClassFromClassLoader("ReturnedObject", getSystemClassLoader()); |
| |
| if (class_ReturnedObject == NULL) { |
| fprintf(stderr, "Error: ReturnedObject class not found or error\n"); |
| return; |
| } |
| |
| mb_ReturnedObject_setReturnedString= |
| findMethod (class_ReturnedObject, "setReturnedString", "(Ljava/lang/String;)V"); |
| |
| if (mb_ReturnedObject_setReturnedString == NULL) { |
| fprintf(stderr, "Error: ReturnedObject.setReturnedString class not found or error\n"); |
| return; |
| } |
| |
| offset_mObj = findField(clazz, "mObj", "Ljava/lang/Object;")->offset; |
| offset_mBool = findField(clazz, "mBool", "Z" )->offset; |
| offset_mInt = findField(clazz, "mInt", "I")->offset; |
| offset_mString = findField(clazz, "mString", "Ljava/lang/String;")->offset; |
| offset_mDouble = findField(clazz, "mDouble", "D")->offset; |
| offset_mLong = findField(clazz, "mLong", "J")->offset; |
| |
| |
| mb_Java_Lang_Object_Equals = findMethod ( |
| findClassFromClassLoader("java/lang/Object", getSystemClassLoader()), |
| "equals", "(Ljava/lang/Object;)Z"); |
| |
| } |
| |
| |