| /* //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"); | |
| } | |