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