diff options
Diffstat (limited to 'core/jni/BindTest.cpp')
-rw-r--r-- | core/jni/BindTest.cpp | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/core/jni/BindTest.cpp b/core/jni/BindTest.cpp new file mode 100644 index 0000000..5fae400 --- /dev/null +++ b/core/jni/BindTest.cpp @@ -0,0 +1,289 @@ +/* //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"); + +} + + |