📄 jsj_convert.c
字号:
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 + -