⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsj_convert.c

📁 caffeine-monkey java实现的js模拟引擎
💻 C
📖 第 1 页 / 共 3 页
字号:
    JSString *js_str;    jboolean is_copy;    const jchar *ucs2_str;    jsize ucs2_str_len;    ucs2_str_len = (*jEnv)->GetStringLength(jEnv, java_str);    ucs2_str = (*jEnv)->GetStringChars(jEnv, java_str, &is_copy);    if (!ucs2_str) {        jsj_UnexpectedJavaError(cx, jEnv,                                "Unable to extract native Unicode from Java string");        return NULL;    }    /* The string data passed into JS_NewUCString() is       not copied, so make a copy of the Unicode character vector. */    js_str = JS_NewUCStringCopyN(cx, ucs2_str, ucs2_str_len);    (*jEnv)->ReleaseStringChars(jEnv, java_str, ucs2_str);    return js_str;}/* * Attempt to obtain a JS string representation of a Java object. * The java_obj argument must be of type java.lang.Object or a subclass. * If java_obj is a Java string, it's value is simply extracted and * copied into a JS string.  Otherwise, the toString() method is called * on java_obj. */JSBooljsj_ConvertJavaObjectToJSString(JSContext *cx,                                JNIEnv *jEnv,                                JavaClassDescriptor *class_descriptor,                                jobject java_obj, jsval *vp){    JSString *js_str;    jstring java_str;    jmethodID toString;    jclass java_class;        /* Create a Java string, unless java_obj is already a java.lang.String */    if ((*jEnv)->IsInstanceOf(jEnv, java_obj, jlString)) {        /* Extract Unicode from java.lang.String instance and convert to JS string */        js_str = jsj_ConvertJavaStringToJSString(cx, jEnv, java_obj);        if (!js_str)            return JS_FALSE;        *vp = STRING_TO_JSVAL(js_str);        return JS_TRUE;    }        java_class = class_descriptor->java_class;    toString = (*jEnv)->GetMethodID(jEnv, java_class, "toString",        "()Ljava/lang/String;");    if (!toString) {        /* All Java objects have a toString method */        jsj_UnexpectedJavaError(cx, jEnv, "No toString() method for class %s!",            class_descriptor->name);        return JS_FALSE;    }    java_str = (*jEnv)->CallObjectMethod(jEnv, java_obj, toString);    if (!java_str) {        jsj_ReportJavaError(cx, jEnv, "toString() method failed");        return JS_FALSE;    }        /* Extract Unicode from java.lang.String instance and convert to JS string */    js_str = jsj_ConvertJavaStringToJSString(cx, jEnv, java_str);    if (!js_str) {        (*jEnv)->DeleteLocalRef(jEnv, java_str);        return JS_FALSE;    }    *vp = STRING_TO_JSVAL(js_str);    (*jEnv)->DeleteLocalRef(jEnv, java_str);    return JS_TRUE;}/* * Convert a Java object to a number by attempting to call the * doubleValue() method on a Java object to get a double result. * This usually only works on instances of java.lang.Double, but the code * is generalized to work with any Java object that supports this method. * * Returns JS_TRUE if the call was successful. * Returns JS_FALSE if conversion is not possible or an error occurs. */JSBooljsj_ConvertJavaObjectToJSNumber(JSContext *cx, JNIEnv *jEnv,                                JavaClassDescriptor *class_descriptor,                                jobject java_obj, jsval *vp){    jdouble d;    jmethodID doubleValue;    jclass java_class;    java_class = class_descriptor->java_class;    doubleValue = (*jEnv)->GetMethodID(jEnv, java_class, "doubleValue", "()D");    if (!doubleValue) {        /* There is no doubleValue() method for the object.  Try toString()           instead and the JS engine will attempt to convert the result to           a number. */        (*jEnv)->ExceptionClear(jEnv);        return jsj_ConvertJavaObjectToJSString(cx, jEnv, class_descriptor,                                               java_obj, vp);    }    /*     * Sun Java-Plugin team work around bug to be fixed in JRE1.5, where GetMethodID      * called with a non-existent method name returns a non-null result.     * See Mozilla bug 201164.     */    if ((*jEnv)->ExceptionOccurred(jEnv)) {        jsj_UnexpectedJavaError(cx, jEnv, "No doubleValue() method for class %s!",            class_descriptor->name);        return JS_FALSE;    }        d = (*jEnv)->CallDoubleMethod(jEnv, java_obj, doubleValue);    if ((*jEnv)->ExceptionOccurred(jEnv)) {        jsj_UnexpectedJavaError(cx, jEnv, "doubleValue() method failed");        return JS_FALSE;    }    return JS_NewDoubleValue(cx, d, vp);}/* * Convert a Java object to a boolean by attempting to call the * booleanValue() method on a Java object to get a boolean result. * This usually only works on instances of java.lang.Boolean, but the code * is generalized to work with any Java object that supports this method. * * Returns JS_TRUE if the call was successful. * Returns JS_FALSE if conversion is not possible or an error occurs. */extern JSBooljsj_ConvertJavaObjectToJSBoolean(JSContext *cx, JNIEnv *jEnv,                                 JavaClassDescriptor *class_descriptor,                                 jobject java_obj, jsval *vp){    jboolean b;    jmethodID booleanValue;    jclass java_class;        /* Null converts to false. */    if (!java_obj) {        *vp = JSVAL_FALSE;        return JS_TRUE;    }    java_class = class_descriptor->java_class;    booleanValue = (*jEnv)->GetMethodID(jEnv, java_class, "booleanValue", "()Z");    /* Non-null Java object does not have a booleanValue() method, so       it converts to true. */    if (!booleanValue) {        (*jEnv)->ExceptionClear(jEnv);        *vp = JSVAL_TRUE;        return JS_TRUE;    }    b = (*jEnv)->CallBooleanMethod(jEnv, java_obj, booleanValue);    if ((*jEnv)->ExceptionOccurred(jEnv)) {        jsj_UnexpectedJavaError(cx, jEnv, "booleanValue() method failed");        return JS_FALSE;    }    *vp = BOOLEAN_TO_JSVAL(b);    return JS_TRUE;}/* * Reflect a Java object into a JS value.  The source object, java_obj, must * be of type java.lang.Object or a subclass and may, therefore, be an array. */JSBooljsj_ConvertJavaObjectToJSValue(JSContext *cx, JNIEnv *jEnv,                               jobject java_obj, jsval *vp){    jclass java_class;    JSObject *js_obj;    /* A null in Java-land is also null in JS */    if (!java_obj) {        *vp = JSVAL_NULL;        return JS_TRUE;    }    java_class = (*jEnv)->GetObjectClass(jEnv, java_obj);    /*     * If it's an instance of netscape.javascript.JSObject, i.e. a wrapper     * around a JS object that has been passed into the Java world, unwrap     * it to obtain the original JS object.     */     if (njJSObject && (*jEnv)->IsInstanceOf(jEnv, java_obj, njJSObject)) {#ifdef PRESERVE_JSOBJECT_IDENTITY#if JS_BYTES_PER_LONG == 8        js_obj = (JSObject *)((*jEnv)->GetLongField(jEnv, java_obj, njJSObject_long_internal));#else        js_obj = (JSObject *)((*jEnv)->GetIntField(jEnv, java_obj, njJSObject_internal));#endif#else        js_obj = jsj_UnwrapJSObjectWrapper(jEnv, java_obj);#endif		/* NULL is actually a valid value. It means 'null'.        JS_ASSERT(js_obj);        if (!js_obj)            goto error;		*/        *vp = OBJECT_TO_JSVAL(js_obj);        goto done;     }    /* otherwise, wrap it inside a JavaObject */    js_obj = jsj_WrapJavaObject(cx, jEnv, java_obj, java_class);    if (!js_obj)        goto error;    *vp = OBJECT_TO_JSVAL(js_obj);done:    (*jEnv)->DeleteLocalRef(jEnv, java_class);    return JS_TRUE;error:    (*jEnv)->DeleteLocalRef(jEnv, java_class);    return JS_FALSE;}/* * Convert a Java value (primitive or object) to a JS value. * * This is usually an infallible operation, but JS_FALSE is returned * on an out-of-memory condition and the error reporter is called. */JSBooljsj_ConvertJavaValueToJSValue(JSContext *cx, JNIEnv *jEnv,                              JavaSignature *signature,                              jvalue *java_value,                              jsval *vp){    int32 ival32;    switch (signature->type) {    case JAVA_SIGNATURE_VOID:        *vp = JSVAL_VOID;        return JS_TRUE;    case JAVA_SIGNATURE_BYTE:        *vp = INT_TO_JSVAL((jsint)java_value->b);        return JS_TRUE;    case JAVA_SIGNATURE_CHAR:        *vp = INT_TO_JSVAL((jsint)java_value->c);        return JS_TRUE;    case JAVA_SIGNATURE_SHORT:        *vp = INT_TO_JSVAL((jsint)java_value->s);        return JS_TRUE;    case JAVA_SIGNATURE_INT:        ival32 = java_value->i;        if (INT_FITS_IN_JSVAL(ival32)) {            *vp = INT_TO_JSVAL((jsint) ival32);            return JS_TRUE;        } else {            return JS_NewDoubleValue(cx, ival32, vp);        }    case JAVA_SIGNATURE_BOOLEAN:        *vp = BOOLEAN_TO_JSVAL((JSBool) java_value->z);        return JS_TRUE;    case JAVA_SIGNATURE_LONG:        return JS_NewDoubleValue(cx, jlong_to_jdouble(java_value->j), vp);      case JAVA_SIGNATURE_FLOAT:        return JS_NewDoubleValue(cx, java_value->f, vp);    case JAVA_SIGNATURE_DOUBLE:        return JS_NewDoubleValue(cx, java_value->d, vp);    case JAVA_SIGNATURE_UNKNOWN:        JS_ASSERT(0);        return JS_FALSE;            /* Non-primitive (reference) type */    default:        JS_ASSERT(IS_REFERENCE_TYPE(signature->type));        return jsj_ConvertJavaObjectToJSValue(cx, jEnv, java_value->l, vp);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -