зеркало из https://github.com/mozilla/pjs.git
Added capability to pass JS arrays as arguments to Java methods.
This commit is contained in:
Родитель
ea3a16ee62
Коммит
57e72d2b3a
|
@ -50,8 +50,7 @@ were integrated with Netscape Navigator versions 4.x and earlier. For info
|
||||||
on LiveConnect version 1, which was used in Navigator versions 3 and 4, and Enterprise
|
on LiveConnect version 1, which was used in Navigator versions 3 and 4, and Enterprise
|
||||||
Server 3, see <a href="http://developer.netscape.com/find/find.cgi?scope=LiveConnect&browse-category=&ui=sr&chunk-size=&page=1&taxonomy=DevEdge+Online">Netscape's
|
Server 3, see <a href="http://developer.netscape.com/find/find.cgi?scope=LiveConnect&browse-category=&ui=sr&chunk-size=&page=1&taxonomy=DevEdge+Online">Netscape's
|
||||||
DevEdge site</a> or any number of 3rd-party publications.)
|
DevEdge site</a> or any number of 3rd-party publications.)
|
||||||
<h4>
|
<h4> LiveConnect version 3 (8/31/99)</h4>
|
||||||
LiveConnect version 3 (10/31/98)</h4>
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li> In previous versions of LiveConnect, when more than one overloaded Java
|
<li> In previous versions of LiveConnect, when more than one overloaded Java
|
||||||
|
@ -115,7 +114,17 @@ LiveConnect version 3 (10/31/98)</h4>
|
||||||
a language feature that debuted in JavaScript 1.4. Now, when JavaScript
|
a language feature that debuted in JavaScript 1.4. Now, when JavaScript
|
||||||
calls into Java, any Java exceptions are converted to JS exceptions which
|
calls into Java, any Java exceptions are converted to JS exceptions which
|
||||||
can be caught using JS try-catch statements. Similarly, JS exceptions
|
can be caught using JS try-catch statements. Similarly, JS exceptions
|
||||||
are propagated to Java wrapped in an instance of <i>netscape.javascript.JSException</i>.</li>
|
are propagated to Java wrapped in an instance of <i>netscape.javascript.JSException</i>.<BR>
|
||||||
|
<BR>
|
||||||
|
</li>
|
||||||
|
<li>JavaScript Array objects can now be passed to Java methods that expect a
|
||||||
|
Java array as an argument. <BR>
|
||||||
|
LiveConnect will create a new Java array of the appropriate type with a length
|
||||||
|
equal to that of the JS Array object. Each element of the Java array is filled
|
||||||
|
in by converting the corresponding element of the JS array, including undefined
|
||||||
|
elements, to an equivalent Java value. Note: Since the contents of the JS
|
||||||
|
array are copied, side-effects made by the invoked Java method to the Java
|
||||||
|
array will not be reflected in the JS array argument. </li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h4>
|
<h4>
|
||||||
|
|
|
@ -74,6 +74,7 @@ report_java_initialization_error(JNIEnv *jEnv, const char *js_error_msg)
|
||||||
jclass jlObject; /* java.lang.Object */
|
jclass jlObject; /* java.lang.Object */
|
||||||
jclass jlrMethod; /* java.lang.reflect.Method */
|
jclass jlrMethod; /* java.lang.reflect.Method */
|
||||||
jclass jlrField; /* java.lang.reflect.Field */
|
jclass jlrField; /* java.lang.reflect.Field */
|
||||||
|
jclass jlrArray; /* java.lang.reflect.Array */
|
||||||
jclass jlVoid; /* java.lang.Void */
|
jclass jlVoid; /* java.lang.Void */
|
||||||
jclass jlrConstructor; /* java.lang.reflect.Constructor */
|
jclass jlrConstructor; /* java.lang.reflect.Constructor */
|
||||||
jclass jlThrowable; /* java.lang.Throwable */
|
jclass jlThrowable; /* java.lang.Throwable */
|
||||||
|
@ -106,6 +107,8 @@ jmethodID jlrField_getName; /* java.lang.reflect.Field.getName() */
|
||||||
jmethodID jlrField_getType; /* java.lang.reflect.Field.getType() */
|
jmethodID jlrField_getType; /* java.lang.reflect.Field.getType() */
|
||||||
jmethodID jlrField_getModifiers; /* java.lang.reflect.Field.getModifiers() */
|
jmethodID jlrField_getModifiers; /* java.lang.reflect.Field.getModifiers() */
|
||||||
|
|
||||||
|
jmethodID jlrArray_newInstance; /* java.lang.reflect.Array.newInstance() */
|
||||||
|
|
||||||
jmethodID jlBoolean_Boolean; /* java.lang.Boolean constructor */
|
jmethodID jlBoolean_Boolean; /* java.lang.Boolean constructor */
|
||||||
jmethodID jlBoolean_booleanValue; /* java.lang.Boolean.booleanValue() */
|
jmethodID jlBoolean_booleanValue; /* java.lang.Boolean.booleanValue() */
|
||||||
jmethodID jlDouble_Double; /* java.lang.Double constructor */
|
jmethodID jlDouble_Double; /* java.lang.Double constructor */
|
||||||
|
@ -229,6 +232,7 @@ init_java_VM_reflection(JSJavaVM *jsjava_vm, JNIEnv *jEnv)
|
||||||
LOAD_CLASS(java/lang/reflect/Method, jlrMethod);
|
LOAD_CLASS(java/lang/reflect/Method, jlrMethod);
|
||||||
LOAD_CLASS(java/lang/reflect/Constructor, jlrConstructor);
|
LOAD_CLASS(java/lang/reflect/Constructor, jlrConstructor);
|
||||||
LOAD_CLASS(java/lang/reflect/Field, jlrField);
|
LOAD_CLASS(java/lang/reflect/Field, jlrField);
|
||||||
|
LOAD_CLASS(java/lang/reflect/Array, jlrArray);
|
||||||
LOAD_CLASS(java/lang/Throwable, jlThrowable);
|
LOAD_CLASS(java/lang/Throwable, jlThrowable);
|
||||||
LOAD_CLASS(java/lang/System, jlSystem);
|
LOAD_CLASS(java/lang/System, jlSystem);
|
||||||
LOAD_CLASS(java/lang/Boolean, jlBoolean);
|
LOAD_CLASS(java/lang/Boolean, jlBoolean);
|
||||||
|
@ -256,6 +260,9 @@ init_java_VM_reflection(JSJavaVM *jsjava_vm, JNIEnv *jEnv)
|
||||||
LOAD_METHOD(java.lang.reflect.Field, getType, "()Ljava/lang/Class;", jlrField);
|
LOAD_METHOD(java.lang.reflect.Field, getType, "()Ljava/lang/Class;", jlrField);
|
||||||
LOAD_METHOD(java.lang.reflect.Field, getModifiers, "()I", jlrField);
|
LOAD_METHOD(java.lang.reflect.Field, getModifiers, "()I", jlrField);
|
||||||
|
|
||||||
|
LOAD_STATIC_METHOD(java.lang.reflect.Array,
|
||||||
|
newInstance, "(Ljava/lang/Class;I)Ljava/lang/Object;",jlrArray);
|
||||||
|
|
||||||
LOAD_METHOD(java.lang.Throwable, toString, "()Ljava/lang/String;", jlThrowable);
|
LOAD_METHOD(java.lang.Throwable, toString, "()Ljava/lang/String;", jlThrowable);
|
||||||
LOAD_METHOD(java.lang.Throwable, getMessage, "()Ljava/lang/String;", jlThrowable);
|
LOAD_METHOD(java.lang.Throwable, getMessage, "()Ljava/lang/String;", jlThrowable);
|
||||||
|
|
||||||
|
@ -555,6 +562,7 @@ JSJ_DisconnectFromJavaVM(JSJavaVM *jsjava_vm)
|
||||||
UNLOAD_CLASS(java/lang/reflect/Method, jlrMethod);
|
UNLOAD_CLASS(java/lang/reflect/Method, jlrMethod);
|
||||||
UNLOAD_CLASS(java/lang/reflect/Constructor, jlrConstructor);
|
UNLOAD_CLASS(java/lang/reflect/Constructor, jlrConstructor);
|
||||||
UNLOAD_CLASS(java/lang/reflect/Field, jlrField);
|
UNLOAD_CLASS(java/lang/reflect/Field, jlrField);
|
||||||
|
UNLOAD_CLASS(java/lang/reflect/Array, jlrArray);
|
||||||
UNLOAD_CLASS(java/lang/Throwable, jlThrowable);
|
UNLOAD_CLASS(java/lang/Throwable, jlThrowable);
|
||||||
UNLOAD_CLASS(java/lang/System, jlSystem);
|
UNLOAD_CLASS(java/lang/System, jlSystem);
|
||||||
UNLOAD_CLASS(java/lang/Boolean, jlBoolean);
|
UNLOAD_CLASS(java/lang/Boolean, jlBoolean);
|
||||||
|
|
|
@ -838,7 +838,7 @@ Java_netscape_javascript_JSObject_getMember(JNIEnv *jEnv,
|
||||||
property_name_ucs2 = NULL;
|
property_name_ucs2 = NULL;
|
||||||
if (!property_name_jstr) {
|
if (!property_name_jstr) {
|
||||||
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
|
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
|
||||||
JSJMSG_NULL_MEMBER_NAME);
|
JSJMSG_NULL_MEMBER_NAME);
|
||||||
member = NULL;
|
member = NULL;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,6 +76,54 @@ convert_js_obj_to_JSObject_wrapper(JSContext *cx, JNIEnv *jEnv, JSObject *js_obj
|
||||||
return (*java_value != NULL);
|
return (*java_value != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Copy an array from JS to Java; Create a new Java array and populate its
|
||||||
|
elements, one by one, with the result of converting each JS array element
|
||||||
|
to the type of the array component. */
|
||||||
|
static JSBool
|
||||||
|
convert_js_array_to_java_array(JSContext *cx, JNIEnv *jEnv, JSObject *js_array,
|
||||||
|
JavaSignature *signature,
|
||||||
|
jobject *java_valuep)
|
||||||
|
{
|
||||||
|
jsuint i;
|
||||||
|
jsval js_val;
|
||||||
|
jsuint length;
|
||||||
|
jclass component_class;
|
||||||
|
jarray java_array;
|
||||||
|
JavaSignature *array_component_signature;
|
||||||
|
|
||||||
|
if (!JS_GetArrayLength(cx, js_array, &length))
|
||||||
|
return JS_FALSE;
|
||||||
|
|
||||||
|
/* Get the Java class of each element of the array */
|
||||||
|
array_component_signature = signature->array_component_signature;
|
||||||
|
component_class = array_component_signature->java_class;
|
||||||
|
|
||||||
|
/* Create a new empty Java array with the same length as the JS array */
|
||||||
|
java_array = (*jEnv)->CallStaticObjectMethod(jEnv, jlrArray, jlrArray_newInstance,
|
||||||
|
component_class, length);
|
||||||
|
if (!java_array) {
|
||||||
|
jsj_ReportJavaError(cx, jEnv, "Error while constructing empty array of %s",
|
||||||
|
jsj_GetJavaClassName(cx, jEnv, component_class));
|
||||||
|
return JS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert each element of the JS array to an element of the Java array.
|
||||||
|
If an error occurs, there is no need to worry about releasing the
|
||||||
|
individual elements of the Java array - they will eventually be GC'ed
|
||||||
|
by the JVM. */
|
||||||
|
for (i = 0; i < length; i++) {
|
||||||
|
if (!JS_LookupElement(cx, js_array, i, &js_val))
|
||||||
|
return JS_FALSE;
|
||||||
|
|
||||||
|
if (!jsj_SetJavaArrayElement(cx, jEnv, java_array, i, array_component_signature, js_val))
|
||||||
|
return JS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the result array */
|
||||||
|
*java_valuep = java_array;
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
jstring
|
jstring
|
||||||
jsj_ConvertJSStringToJavaString(JSContext *cx, JNIEnv *jEnv, JSString *js_str)
|
jsj_ConvertJSStringToJavaString(JSContext *cx, JNIEnv *jEnv, JSString *js_str)
|
||||||
{
|
{
|
||||||
|
@ -169,6 +217,15 @@ jsj_ConvertJSValueToJavaObject(JSContext *cx, JNIEnv *jEnv, jsval v, JavaSignatu
|
||||||
return jsj_ConvertJSValueToJavaObject(cx, jEnv, v, signature, cost,
|
return jsj_ConvertJSValueToJavaObject(cx, jEnv, v, signature, cost,
|
||||||
java_value, is_local_refp);
|
java_value, is_local_refp);
|
||||||
|
|
||||||
|
/* JS Arrays are converted, element by element, to Java arrays */
|
||||||
|
} else if (JS_IsArrayObject(cx, js_obj) && (signature->type == JAVA_SIGNATURE_ARRAY)) {
|
||||||
|
if (convert_js_array_to_java_array(cx, jEnv, js_obj, signature, java_value)) {
|
||||||
|
if (java_value && *java_value)
|
||||||
|
*is_local_refp = JS_TRUE;
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
return JS_FALSE;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/* Otherwise, see if the target type is the netscape.javascript.JSObject
|
/* Otherwise, see if the target type is the netscape.javascript.JSObject
|
||||||
wrapper class or one of its subclasses, in which case a
|
wrapper class or one of its subclasses, in which case a
|
||||||
|
@ -227,7 +284,9 @@ jsj_ConvertJSValueToJavaObject(JSContext *cx, JNIEnv *jEnv, jsval v, JavaSignatu
|
||||||
/* Fall through, to attempt conversion to a java.lang.String ... */
|
/* Fall through, to attempt conversion to a java.lang.String ... */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If no other conversion is possible, see if the target type is java.lang.String */
|
/* If the source JS type is either a string or undefined, or if no conversion
|
||||||
|
is possible from a number, boolean or JS object, see if the target type is
|
||||||
|
java.lang.String */
|
||||||
if ((*jEnv)->IsAssignableFrom(jEnv, jlString, target_java_class)) {
|
if ((*jEnv)->IsAssignableFrom(jEnv, jlString, target_java_class)) {
|
||||||
|
|
||||||
/* Convert to JS string, if necessary, and then to a Java Unicode string */
|
/* Convert to JS string, if necessary, and then to a Java Unicode string */
|
||||||
|
@ -503,6 +562,7 @@ conversion_error:
|
||||||
|
|
||||||
if (java_value) {
|
if (java_value) {
|
||||||
const char *jsval_string;
|
const char *jsval_string;
|
||||||
|
const char *class_name;
|
||||||
JSString *jsstr;
|
JSString *jsstr;
|
||||||
|
|
||||||
jsval_string = NULL;
|
jsval_string = NULL;
|
||||||
|
@ -512,8 +572,11 @@ conversion_error:
|
||||||
if (!jsval_string)
|
if (!jsval_string)
|
||||||
jsval_string = "";
|
jsval_string = "";
|
||||||
|
|
||||||
|
class_name = jsj_ConvertJavaSignatureToHRString(cx, signature);
|
||||||
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
|
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
|
||||||
JSJMSG_CANT_CONVERT_JS, jsval_string, signature->name);
|
JSJMSG_CANT_CONVERT_JS, jsval_string,
|
||||||
|
class_name);
|
||||||
|
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
}
|
}
|
||||||
return success;
|
return success;
|
||||||
|
|
|
@ -65,6 +65,7 @@ typedef enum JSJType {
|
||||||
JSJTYPE_JAVACLASS, /* JavaClass */
|
JSJTYPE_JAVACLASS, /* JavaClass */
|
||||||
JSJTYPE_JAVAOBJECT, /* JavaObject */
|
JSJTYPE_JAVAOBJECT, /* JavaObject */
|
||||||
JSJTYPE_JAVAARRAY, /* JavaArray */
|
JSJTYPE_JAVAARRAY, /* JavaArray */
|
||||||
|
JSJTYPE_JSARRAY, /* JS Array */
|
||||||
JSJTYPE_OBJECT, /* Any other JS Object, including functions */
|
JSJTYPE_OBJECT, /* Any other JS Object, including functions */
|
||||||
JSJTYPE_LIMIT
|
JSJTYPE_LIMIT
|
||||||
} JSJType;
|
} JSJType;
|
||||||
|
@ -939,6 +940,8 @@ compute_jsj_type(JSContext *cx, jsval v)
|
||||||
return JSJTYPE_JAVAARRAY;
|
return JSJTYPE_JAVAARRAY;
|
||||||
if (JS_InstanceOf(cx, js_obj, &JavaClass_class, 0))
|
if (JS_InstanceOf(cx, js_obj, &JavaClass_class, 0))
|
||||||
return JSJTYPE_JAVACLASS;
|
return JSJTYPE_JAVACLASS;
|
||||||
|
if (JS_IsArrayObject(cx, js_obj))
|
||||||
|
return JSJTYPE_JSARRAY;
|
||||||
return JSJTYPE_OBJECT;
|
return JSJTYPE_OBJECT;
|
||||||
} else if (JSVAL_IS_NUMBER(v)) {
|
} else if (JSVAL_IS_NUMBER(v)) {
|
||||||
return JSJTYPE_NUMBER;
|
return JSJTYPE_NUMBER;
|
||||||
|
@ -978,7 +981,8 @@ static int rank_table[JSJTYPE_LIMIT][JAVA_SIGNATURE_LIMIT] = {
|
||||||
{99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 1, 99, 2, 3, 4}, /* JavaClass */
|
{99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 1, 99, 2, 3, 4}, /* JavaClass */
|
||||||
{99, 7, 8, 6, 5, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 1}, /* JavaObject */
|
{99, 7, 8, 6, 5, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 1}, /* JavaObject */
|
||||||
{99, 99, 99, 99, 99, 99, 99, 99, 0, 0, 99, 99, 99, 99, 0, 1}, /* JavaArray */
|
{99, 99, 99, 99, 99, 99, 99, 99, 0, 0, 99, 99, 99, 99, 0, 1}, /* JavaArray */
|
||||||
{99, 9, 10, 8, 7, 6, 5, 4, 99, 99, 99, 99, 99, 1, 2, 3}, /* other JS object */
|
{99, 99, 99, 99, 99, 99, 99, 99, 2, 99, 99, 99, 99, 1, 3, 4}, /* JS Array */
|
||||||
|
{99, 9, 10, 8, 7, 6, 5, 4, 99, 99, 99, 99, 99, 1, 2, 3} /* other JS object */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -248,6 +248,7 @@ extern JSClass JavaMember_class;
|
||||||
*/
|
*/
|
||||||
extern jclass jlObject; /* java.lang.Object */
|
extern jclass jlObject; /* java.lang.Object */
|
||||||
extern jclass jlrConstructor; /* java.lang.reflect.Constructor */
|
extern jclass jlrConstructor; /* java.lang.reflect.Constructor */
|
||||||
|
extern jclass jlrArray; /* java.lang.reflect.Array */
|
||||||
extern jclass jlThrowable; /* java.lang.Throwable */
|
extern jclass jlThrowable; /* java.lang.Throwable */
|
||||||
extern jclass jlSystem; /* java.lang.System */
|
extern jclass jlSystem; /* java.lang.System */
|
||||||
extern jclass jlClass; /* java.lang.Class */
|
extern jclass jlClass; /* java.lang.Class */
|
||||||
|
@ -278,6 +279,8 @@ extern jmethodID jlrField_getName; /* java.lang.reflect.Field.getNam
|
||||||
extern jmethodID jlrField_getType; /* java.lang.reflect.Field.getType() */
|
extern jmethodID jlrField_getType; /* java.lang.reflect.Field.getType() */
|
||||||
extern jmethodID jlrField_getModifiers; /* java.lang.reflect.Field.getModifiers() */
|
extern jmethodID jlrField_getModifiers; /* java.lang.reflect.Field.getModifiers() */
|
||||||
|
|
||||||
|
extern jmethodID jlrArray_newInstance; /* java.lang.reflect.Array.newInstance() */
|
||||||
|
|
||||||
extern jmethodID jlThrowable_getMessage; /* java.lang.Throwable.getMessage() */
|
extern jmethodID jlThrowable_getMessage; /* java.lang.Throwable.getMessage() */
|
||||||
extern jmethodID jlThrowable_toString; /* java.lang.Throwable.toString() */
|
extern jmethodID jlThrowable_toString; /* java.lang.Throwable.toString() */
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче