summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk10
-rw-r--r--V8Binding/jni/jni_instance.h2
-rw-r--r--V8Binding/jni/jni_utility.cpp549
-rw-r--r--V8Binding/jni/jni_utility.h280
-rw-r--r--WebCore/Android.v8bindings.mk4
-rw-r--r--WebCore/bridge/jni/v8/jni_utility_private.cpp258
-rw-r--r--WebCore/bridge/jni/v8/jni_utility_private.h43
7 files changed, 314 insertions, 832 deletions
diff --git a/Android.mk b/Android.mk
index 52392fe..2b0e92d 100644
--- a/Android.mk
+++ b/Android.mk
@@ -84,13 +84,17 @@ ifeq ($(JAVASCRIPT_ENGINE),v8)
include $(LOCAL_PATH)/Android.v8bindings.mk
# TODO: We should use the WebCore JNI code instead.
JNI_PATH := V8Binding/jni
-BINDING_C_INCLUDES += $(BASE_PATH)/$(JNI_PATH)
+# bridge/jni path must be listed after V8Bindings, so files are preferentially
+# included from V8bindings.
+BINDING_C_INCLUDES += \
+ $(BASE_PATH)/$(JNI_PATH) \
+ $(LOCAL_PATH)/bridge/jni \
+ $(LOCAL_PATH)/bridge/jni/v8
JNI_SRC_FILES := \
jni_class.cpp \
jni_instance.cpp \
jni_npobject.cpp \
- jni_runtime.cpp \
- jni_utility.cpp
+ jni_runtime.cpp
WEBKIT_SRC_FILES += $(addprefix $(JNI_PATH)/,$(JNI_SRC_FILES))
endif
WEBKIT_SRC_FILES += $(addprefix $d/,$(LOCAL_SRC_FILES))
diff --git a/V8Binding/jni/jni_instance.h b/V8Binding/jni/jni_instance.h
index 26f316d..94706c8 100644
--- a/V8Binding/jni/jni_instance.h
+++ b/V8Binding/jni/jni_instance.h
@@ -27,6 +27,8 @@
#ifndef _JNI_INSTANCE_H_
#define _JNI_INSTANCE_H_
+#include "jni_utility_private.h"
+
#include <JavaVM/jni.h>
#include <wtf/RefPtr.h>
diff --git a/V8Binding/jni/jni_utility.cpp b/V8Binding/jni/jni_utility.cpp
deleted file mode 100644
index 8b907a4..0000000
--- a/V8Binding/jni/jni_utility.cpp
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- * Copyright (C) 2003 Apple Computer, Inc. All rights reserved.
- * Copyright 2009, The Android Open Source Project
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "npruntime.h"
-#include "jni_utility.h"
-#include "jni_runtime.h"
-#include "jni_npobject.h"
-
-#include <dlfcn.h>
-
-namespace JSC {
-
-namespace Bindings {
-
-static jint KJS_GetCreatedJavaVMs(JavaVM** vmBuf, jsize bufLen, jsize* nVMs)
-{
- static void* javaVMFramework = 0;
- if (!javaVMFramework)
- javaVMFramework = dlopen("/System/Library/Frameworks/JavaVM.framework/JavaVM", RTLD_LAZY);
- if (!javaVMFramework)
- return JNI_ERR;
-
- static jint(*functionPointer)(JavaVM**, jsize, jsize *) = 0;
- if (!functionPointer)
- functionPointer = (jint(*)(JavaVM**, jsize, jsize *))dlsym(javaVMFramework, "JNI_GetCreatedJavaVMs");
- if (!functionPointer)
- return JNI_ERR;
- return functionPointer(vmBuf, bufLen, nVMs);
-}
-
-static JavaVM *jvm = 0;
-
-// Provide the ability for an outside component to specify the JavaVM to use
-// If the jvm value is set, the getJavaVM function below will just return.
-// In getJNIEnv(), if AttachCurrentThread is called to a VM that is already
-// attached, the result is a no-op.
-void setJavaVM(JavaVM *javaVM)
-{
- jvm = javaVM;
-}
-
-JavaVM *getJavaVM()
-{
- if (jvm)
- return jvm;
-
- JavaVM *jvmArray[1];
- jsize bufLen = 1;
- jsize nJVMs = 0;
- jint jniError = 0;
-
- // Assumes JVM is already running ..., one per process
- jniError = KJS_GetCreatedJavaVMs(jvmArray, bufLen, &nJVMs);
- if ( jniError == JNI_OK && nJVMs > 0 ) {
- jvm = jvmArray[0];
- }
- else
- fprintf(stderr, "%s: JNI_GetCreatedJavaVMs failed, returned %ld\n", __PRETTY_FUNCTION__, (long)jniError);
-
- return jvm;
-}
-
-JNIEnv* getJNIEnv()
-{
- union {
- JNIEnv* env;
- void* dummy;
- } u;
- jint jniError = 0;
-
- jniError = (getJavaVM())->AttachCurrentThread(&u.dummy, NULL);
- if (jniError == JNI_OK)
- return u.env;
- else
- fprintf(stderr, "%s: AttachCurrentThread failed, returned %ld\n", __PRETTY_FUNCTION__, (long)jniError);
- return NULL;
-}
-
-jmethodID getMethodID (jobject obj, const char *name, const char *sig)
-{
- JNIEnv *env = getJNIEnv();
- jmethodID mid = 0;
-
- if ( env != NULL) {
- jclass cls = env->GetObjectClass(obj);
- if ( cls != NULL ) {
- mid = env->GetMethodID(cls, name, sig);
- if (!mid) {
- env->ExceptionClear();
- mid = env->GetStaticMethodID(cls, name, sig);
- if (!mid) {
- env->ExceptionClear();
- }
- }
- }
- env->DeleteLocalRef(cls);
- }
- return mid;
-}
-
-const char *getCharactersFromJString (jstring aJString)
-{
- return getCharactersFromJStringInEnv (getJNIEnv(), aJString);
-}
-
-void releaseCharactersForJString (jstring aJString, const char *s)
-{
- releaseCharactersForJStringInEnv (getJNIEnv(), aJString, s);
-}
-
-const char *getCharactersFromJStringInEnv (JNIEnv *env, jstring aJString)
-{
- jboolean isCopy;
- const char *s = env->GetStringUTFChars((jstring)aJString, &isCopy);
- if (!s) {
- env->ExceptionDescribe();
- env->ExceptionClear();
- fprintf (stderr, "\n");
- }
- return s;
-}
-
-void releaseCharactersForJStringInEnv (JNIEnv *env, jstring aJString, const char *s)
-{
- env->ReleaseStringUTFChars (aJString, s);
-}
-
-const jchar *getUCharactersFromJStringInEnv (JNIEnv *env, jstring aJString)
-{
- jboolean isCopy;
- const jchar *s = env->GetStringChars((jstring)aJString, &isCopy);
- if (!s) {
- env->ExceptionDescribe();
- env->ExceptionClear();
- fprintf (stderr, "\n");
- }
- return s;
-}
-
-void releaseUCharactersForJStringInEnv (JNIEnv *env, jstring aJString, const jchar *s)
-{
- env->ReleaseStringChars (aJString, s);
-}
-
-JNIType JNITypeFromClassName(const char *name)
-{
- JNIType type;
-
- if (strcmp("byte",name) == 0)
- type = byte_type;
- else if (strcmp("short",name) == 0)
- type = short_type;
- else if (strcmp("int",name) == 0)
- type = int_type;
- else if (strcmp("long",name) == 0)
- type = long_type;
- else if (strcmp("float",name) == 0)
- type = float_type;
- else if (strcmp("double",name) == 0)
- type = double_type;
- else if (strcmp("char",name) == 0)
- type = char_type;
- else if (strcmp("boolean",name) == 0)
- type = boolean_type;
- else if (strcmp("void",name) == 0)
- type = void_type;
- else if ('[' == name[0])
- type = array_type;
- else
- type = object_type;
-
- return type;
-}
-
-const char *signatureFromPrimitiveType(JNIType type)
-{
- switch (type){
- case void_type:
- return "V";
-
- case array_type:
- return "[";
-
- case object_type:
- return "L";
-
- case boolean_type:
- return "Z";
-
- case byte_type:
- return "B";
-
- case char_type:
- return "C";
-
- case short_type:
- return "S";
-
- case int_type:
- return "I";
-
- case long_type:
- return "J";
-
- case float_type:
- return "F";
-
- case double_type:
- return "D";
-
- case invalid_type:
- default:
- break;
- }
- return "";
-}
-
-JNIType JNITypeFromPrimitiveType(char type)
-{
- switch (type){
- case 'V':
- return void_type;
-
- case 'L':
- return object_type;
-
- case '[':
- return array_type;
-
- case 'Z':
- return boolean_type;
-
- case 'B':
- return byte_type;
-
- case 'C':
- return char_type;
-
- case 'S':
- return short_type;
-
- case 'I':
- return int_type;
-
- case 'J':
- return long_type;
-
- case 'F':
- return float_type;
-
- case 'D':
- return double_type;
-
- default:
- break;
- }
- return invalid_type;
-}
-
-jvalue getJNIField( jobject obj, JNIType type, const char *name, const char *signature)
-{
- JavaVM *jvm = getJavaVM();
- JNIEnv *env = getJNIEnv();
- jvalue result;
-
- bzero (&result, sizeof(jvalue));
- if ( obj != NULL && jvm != NULL && env != NULL) {
- jclass cls = env->GetObjectClass(obj);
- if ( cls != NULL ) {
- jfieldID field = env->GetFieldID(cls, name, signature);
- if ( field != NULL ) {
- switch (type) {
- case array_type:
- case object_type:
- result.l = env->functions->GetObjectField(env, obj, field);
- break;
- case boolean_type:
- result.z = env->functions->GetBooleanField(env, obj, field);
- break;
- case byte_type:
- result.b = env->functions->GetByteField(env, obj, field);
- break;
- case char_type:
- result.c = env->functions->GetCharField(env, obj, field);
- break;
- case short_type:
- result.s = env->functions->GetShortField(env, obj, field);
- break;
- case int_type:
- result.i = env->functions->GetIntField(env, obj, field);
- break;
- case long_type:
- result.j = env->functions->GetLongField(env, obj, field);
- break;
- case float_type:
- result.f = env->functions->GetFloatField(env, obj, field);
- break;
- case double_type:
- result.d = env->functions->GetDoubleField(env, obj, field);
- break;
- default:
- fprintf(stderr, "%s: invalid field type (%d)\n", __PRETTY_FUNCTION__, (int)type);
- }
- }
- else
- {
- fprintf(stderr, "%s: Could not find field: %s\n", __PRETTY_FUNCTION__, name);
- env->ExceptionDescribe();
- env->ExceptionClear();
- fprintf (stderr, "\n");
- }
-
- env->DeleteLocalRef(cls);
- }
- else {
- fprintf(stderr, "%s: Could not find class for object\n", __PRETTY_FUNCTION__);
- }
- }
-
- return result;
-}
-
-
-jvalue convertNPVariantToJValue(NPVariant value, JNIType _JNIType, const char* javaClassName)
-{
- jvalue result;
- NPVariantType type = value.type;
-
- switch (_JNIType){
- case array_type:
- case object_type: {
- result.l = (jobject)0;
-
- // First see if we have a Java instance.
- if (type == NPVariantType_Object) {
- NPObject* objectImp = NPVARIANT_TO_OBJECT(value);
- if (JavaInstance* instance = ExtractJavaInstance(objectImp))
- result.l = instance->getLocalRef();
- }
-
- // Now convert value to a string if the target type is a java.lang.string, and we're not
- // converting from a Null.
- if (result.l == 0 && strcmp(javaClassName, "java.lang.String") == 0) {
-#ifdef CONVERT_NULL_TO_EMPTY_STRING
- if (type == NPVariantType_Null) {
- JNIEnv *env = getJNIEnv();
- jchar buf[2];
- jobject javaString = env->functions->NewString (env, buf, 0);
- result.l = javaString;
- }
- else
-#else
- if (type == NPVariantType_String) {
-#endif
- NPString src = NPVARIANT_TO_STRING(value);
- JNIEnv *env = getJNIEnv();
- jobject javaString = env->NewStringUTF(src.UTF8Characters);
- result.l = javaString;
- }
- } else if (result.l == 0)
- bzero (&result, sizeof(jvalue)); // Handle it the same as a void case
- }
- break;
-
- case boolean_type: {
- if (type == NPVariantType_Bool)
- result.z = NPVARIANT_TO_BOOLEAN(value);
- else
- bzero(&result, sizeof(jvalue)); // as void case
- }
- break;
-
- case byte_type: {
- if (type == NPVariantType_Int32)
- result.b = (char)NPVARIANT_TO_INT32(value);
- else
- bzero(&result, sizeof(jvalue));
- }
- break;
-
- case char_type: {
- if (type == NPVariantType_Int32)
- result.c = (char)NPVARIANT_TO_INT32(value);
- else
- bzero(&result, sizeof(jvalue));
- }
- break;
-
- case short_type: {
- if (type == NPVariantType_Int32)
- result.s = (jshort)NPVARIANT_TO_INT32(value);
- else
- bzero(&result, sizeof(jvalue));
- }
- break;
-
- case int_type: {
- if (type == NPVariantType_Int32)
- result.i = (jint)NPVARIANT_TO_INT32(value);
- else
- bzero(&result, sizeof(jvalue));
- }
- break;
-
- case long_type: {
- if (type == NPVariantType_Int32)
- result.j = (jlong)NPVARIANT_TO_INT32(value);
- else if (type == NPVariantType_Double)
- result.j = (jlong)NPVARIANT_TO_DOUBLE(value);
- else
- bzero(&result, sizeof(jvalue));
- }
- break;
-
- case float_type: {
- if (type == NPVariantType_Int32)
- result.j = (jfloat)NPVARIANT_TO_INT32(value);
- else if (type == NPVariantType_Double)
- result.j = (jfloat)NPVARIANT_TO_DOUBLE(value);
- else
- bzero(&result, sizeof(jvalue));
- }
- break;
-
- case double_type: {
- if (type == NPVariantType_Int32)
- result.j = (jdouble)NPVARIANT_TO_INT32(value);
- else if (type == NPVariantType_Double)
- result.j = (jdouble)NPVARIANT_TO_DOUBLE(value);
- else
- bzero(&result, sizeof(jvalue));
- }
- break;
-
- break;
-
- case invalid_type:
- default:
- case void_type: {
- bzero (&result, sizeof(jvalue));
- }
- break;
- }
- return result;
-}
-
-
-void convertJValueToNPVariant(jvalue value, JNIType _JNIType, const char* javaTypeName, NPVariant* result)
-{
- switch (_JNIType){
- case void_type: {
- VOID_TO_NPVARIANT(*result);
- }
- break;
-
- case object_type: {
- if (value.l != 0) {
- if (strcmp(javaTypeName, "java.lang.String") == 0) {
- const char* v = getCharactersFromJString((jstring)value.l);
- // s is freed in NPN_ReleaseVariantValue (see npruntime.cpp)
- const char* s = strdup(v);
- releaseCharactersForJString((jstring)value.l, v);
- STRINGZ_TO_NPVARIANT(s, *result);
- } else {
- OBJECT_TO_NPVARIANT(JavaInstanceToNPObject(new JavaInstance(value.l)), *result);
- }
- }
- else {
- VOID_TO_NPVARIANT(*result);
- }
- }
- break;
-
- case boolean_type: {
- BOOLEAN_TO_NPVARIANT(value.z, *result);
- }
- break;
-
- case byte_type: {
- INT32_TO_NPVARIANT(value.b, *result);
- }
- break;
-
- case char_type: {
- INT32_TO_NPVARIANT(value.c, *result);
- }
- break;
-
- case short_type: {
- INT32_TO_NPVARIANT(value.s, *result);
- }
- break;
-
- case int_type: {
- INT32_TO_NPVARIANT(value.i, *result);
- }
- break;
-
- // TODO(fqian): check if cast to double is needed.
- case long_type: {
- DOUBLE_TO_NPVARIANT(value.j, *result);
- }
- break;
-
- case float_type: {
- DOUBLE_TO_NPVARIANT(value.f, *result);
- }
- break;
-
- case double_type: {
- DOUBLE_TO_NPVARIANT(value.d, *result);
- }
- break;
-
- case invalid_type:
- default: {
- VOID_TO_NPVARIANT(*result);
- }
- break;
- }
-}
-
-} // end of namespace Bindings
-
-} // end of namespace JSC
diff --git a/V8Binding/jni/jni_utility.h b/V8Binding/jni/jni_utility.h
deleted file mode 100644
index 917e3d1..0000000
--- a/V8Binding/jni/jni_utility.h
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Copyright (C) 2003 Apple Computer, Inc. All rights reserved.
- * Copyright 2009, The Android Open Source Project
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _JNI_UTILITY_H_
-#define _JNI_UTILITY_H_
-
-#include <JavaVM/jni.h>
-#include "npruntime.h"
-
-// The order of these items can not be modified as they are tightly
-// bound with the JVM on Mac OSX. If new types need to be added, they
-// should be added to the end. It is used in jni_obc.mm when calling
-// through to the JVM. Newly added items need to be made compatible
-// in that file.
-typedef enum {
- invalid_type = 0,
- void_type,
- object_type,
- boolean_type,
- byte_type,
- char_type,
- short_type,
- int_type,
- long_type,
- float_type,
- double_type,
- array_type
-} JNIType;
-
-namespace JSC {
-
-namespace Bindings {
-
-const char *getCharactersFromJString(jstring aJString);
-void releaseCharactersForJString(jstring aJString, const char *s);
-
-const char *getCharactersFromJStringInEnv(JNIEnv *env, jstring aJString);
-void releaseCharactersForJStringInEnv(JNIEnv *env, jstring aJString, const char *s);
-const jchar *getUCharactersFromJStringInEnv(JNIEnv *env, jstring aJString);
-void releaseUCharactersForJStringInEnv(JNIEnv *env, jstring aJString, const jchar *s);
-
-JNIType JNITypeFromClassName(const char *name);
-JNIType JNITypeFromPrimitiveType(char type);
-const char *signatureFromPrimitiveType(JNIType type);
-
-jvalue convertNPVariantToJValue(NPVariant, JNIType, const char* javaClassName);
-void convertJValueToNPVariant(jvalue, JNIType, const char* javaClassName, NPVariant*);
-
-jvalue getJNIField(jobject obj, JNIType type, const char *name, const char *signature);
-
-jmethodID getMethodID(jobject obj, const char *name, const char *sig);
-JNIEnv* getJNIEnv();
-JavaVM* getJavaVM();
-void setJavaVM(JavaVM*);
-
-
-template <typename T> struct JNICaller;
-
-template<> struct JNICaller<void> {
- static void callA(jobject obj, jmethodID mid, jvalue* args)
- {
- return getJNIEnv()->CallVoidMethodA(obj, mid, args);
- }
- static void callV(jobject obj, jmethodID mid, va_list args)
- {
- return getJNIEnv()->CallVoidMethodV(obj, mid, args);
- }
-};
-
-template<> struct JNICaller<jobject> {
- static jobject callA(jobject obj, jmethodID mid, jvalue* args)
- {
- return getJNIEnv()->CallObjectMethodA(obj, mid, args);
- }
- static jobject callV(jobject obj, jmethodID mid, va_list args)
- {
- return getJNIEnv()->CallObjectMethodV(obj, mid, args);
- }
-};
-
-template<> struct JNICaller<jboolean> {
- static jboolean callA(jobject obj, jmethodID mid, jvalue* args)
- {
- return getJNIEnv()->CallBooleanMethodA(obj, mid, args);
- }
- static jboolean callV(jobject obj, jmethodID mid, va_list args)
- {
- return getJNIEnv()->CallBooleanMethodV(obj, mid, args);
- }
- static jboolean callStaticV(jclass cls, jmethodID mid, va_list args)
- {
- return getJNIEnv()->CallStaticBooleanMethod(cls, mid, args);
- }
-
-};
-
-template<> struct JNICaller<jbyte> {
- static jbyte callA(jobject obj, jmethodID mid, jvalue* args)
- {
- return getJNIEnv()->CallByteMethodA(obj, mid, args);
- }
- static jbyte callV(jobject obj, jmethodID mid, va_list args)
- {
- return getJNIEnv()->CallByteMethodV(obj, mid, args);
- }
-};
-
-template<> struct JNICaller<jchar> {
- static jchar callA(jobject obj, jmethodID mid, jvalue* args)
- {
- return getJNIEnv()->CallCharMethodA(obj, mid, args);
- }
- static jchar callV(jobject obj, jmethodID mid, va_list args)
- {
- return getJNIEnv()->CallCharMethodV(obj, mid, args);
- }
-};
-
-template<> struct JNICaller<jshort> {
- static jshort callA(jobject obj, jmethodID mid, jvalue* args)
- {
- return getJNIEnv()->CallShortMethodA(obj, mid, args);
- }
- static jshort callV(jobject obj, jmethodID mid, va_list args)
- {
- return getJNIEnv()->CallShortMethodV(obj, mid, args);
- }
-};
-
-template<> struct JNICaller<jint> {
- static jint callA(jobject obj, jmethodID mid, jvalue* args)
- {
- return getJNIEnv()->CallIntMethodA(obj, mid, args);
- }
- static jint callV(jobject obj, jmethodID mid, va_list args)
- {
- return getJNIEnv()->CallIntMethodV(obj, mid, args);
- }
-};
-
-template<> struct JNICaller<jlong> {
- static jlong callA(jobject obj, jmethodID mid, jvalue* args)
- {
- return getJNIEnv()->CallLongMethodA(obj, mid, args);
- }
- static jlong callV(jobject obj, jmethodID mid, va_list args)
- {
- return getJNIEnv()->CallLongMethodV(obj, mid, args);
- }
-};
-
-template<> struct JNICaller<jfloat> {
- static jfloat callA(jobject obj, jmethodID mid, jvalue* args)
- {
- return getJNIEnv()->CallFloatMethodA(obj, mid, args);
- }
- static jfloat callV(jobject obj, jmethodID mid, va_list args)
- {
- return getJNIEnv()->CallFloatMethodV(obj, mid, args);
- }
-};
-
-template<> struct JNICaller<jdouble> {
- static jdouble callA(jobject obj, jmethodID mid, jvalue* args)
- {
- return getJNIEnv()->CallDoubleMethodA(obj, mid, args);
- }
- static jdouble callV(jobject obj, jmethodID mid, va_list args)
- {
- return getJNIEnv()->CallDoubleMethodV(obj, mid, args);
- }
-};
-
-template<typename T> T callJNIMethodIDA(jobject obj, jmethodID mid, jvalue *args)
-{
- return JNICaller<T>::callA(obj, mid, args);
-}
-
-template<typename T>
-static T callJNIMethodV(jobject obj, const char *name, const char *sig, va_list args)
-{
- JavaVM *jvm = getJavaVM();
- JNIEnv *env = getJNIEnv();
-
- if ( obj != NULL && jvm != NULL && env != NULL) {
- jclass cls = env->GetObjectClass(obj);
- if ( cls != NULL ) {
- jmethodID mid = env->GetMethodID(cls, name, sig);
- if ( mid != NULL )
- {
- env->DeleteLocalRef(cls);
- return JNICaller<T>::callV(obj, mid, args);
- }
- else
- {
- fprintf(stderr, "%s: Could not find method: %s for %p\n", __PRETTY_FUNCTION__, name, obj);
- env->ExceptionDescribe();
- env->ExceptionClear();
- fprintf (stderr, "\n");
- }
-
- env->DeleteLocalRef(cls);
- }
- else {
- fprintf(stderr, "%s: Could not find class for %p\n", __PRETTY_FUNCTION__, obj);
- }
- }
-
- return 0;
-}
-
-template<typename T>
-T callJNIMethod(jobject obj, const char* methodName, const char* methodSignature, ...)
-{
- va_list args;
- va_start(args, methodSignature);
-
- T result= callJNIMethodV<T>(obj, methodName, methodSignature, args);
-
- va_end(args);
-
- return result;
-}
-
-template<typename T>
-T callJNIStaticMethod(jclass cls, const char* methodName, const char* methodSignature, ...)
-{
- JavaVM *jvm = getJavaVM();
- JNIEnv *env = getJNIEnv();
- va_list args;
-
- va_start(args, methodSignature);
-
- T result = 0;
-
- if (cls != NULL && jvm != NULL && env != NULL) {
- jmethodID mid = env->GetStaticMethodID(cls, methodName, methodSignature);
- if (mid != NULL)
- result = JNICaller<T>::callStaticV(cls, mid, args);
- else {
- fprintf(stderr, "%s: Could not find method: %s for %p\n", __PRETTY_FUNCTION__, methodName, cls);
- env->ExceptionDescribe();
- env->ExceptionClear();
- fprintf (stderr, "\n");
- }
- }
-
- va_end(args);
-
- return result;
-}
-
-} // namespace Bindings
-
-} // namespace JSC
-
-#endif // _JNI_UTILITY_H_
diff --git a/WebCore/Android.v8bindings.mk b/WebCore/Android.v8bindings.mk
index 73a0eaf..f683fca 100644
--- a/WebCore/Android.v8bindings.mk
+++ b/WebCore/Android.v8bindings.mk
@@ -176,3 +176,7 @@ LOCAL_SRC_FILES += \
bindings/v8/custom/V8XMLHttpRequestCustom.cpp \
bindings/v8/custom/V8XMLHttpRequestUploadCustom.cpp \
bindings/v8/custom/V8XMLSerializerConstructor.cpp
+
+LOCAL_SRC_FILES += \
+ bridge/jni/jni_utility.cpp \
+ bridge/jni/v8/jni_utility_private.cpp
diff --git a/WebCore/bridge/jni/v8/jni_utility_private.cpp b/WebCore/bridge/jni/v8/jni_utility_private.cpp
new file mode 100644
index 0000000..c58472e
--- /dev/null
+++ b/WebCore/bridge/jni/v8/jni_utility_private.cpp
@@ -0,0 +1,258 @@
+/*
+ * Copyright 2009, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "jni_utility_private.h"
+
+#include "jni_runtime.h"
+#include "jni_npobject.h"
+
+namespace JSC {
+
+namespace Bindings {
+
+jvalue convertNPVariantToJValue(NPVariant value, JNIType jniType, const char* javaClassName)
+{
+ jvalue result;
+ NPVariantType type = value.type;
+
+ switch (jniType) {
+ case array_type:
+ case object_type:
+ {
+ result.l = (jobject)0;
+
+ // First see if we have a Java instance.
+ if (type == NPVariantType_Object) {
+ NPObject* objectImp = NPVARIANT_TO_OBJECT(value);
+ if (JavaInstance* instance = ExtractJavaInstance(objectImp))
+ result.l = instance->getLocalRef();
+ }
+
+ // Now convert value to a string if the target type is a java.lang.string, and we're not
+ // converting from a Null.
+ if (result.l == 0 && strcmp(javaClassName, "java.lang.String") == 0) {
+#ifdef CONVERT_NULL_TO_EMPTY_STRING
+ if (type == NPVariantType_Null) {
+ JNIEnv *env = getJNIEnv();
+ jchar buf[2];
+ jobject javaString = env->functions->NewString (env, buf, 0);
+ result.l = javaString;
+ }
+ else
+#else
+ if (type == NPVariantType_String) {
+#endif
+ NPString src = NPVARIANT_TO_STRING(value);
+ JNIEnv *env = getJNIEnv();
+ jobject javaString = env->NewStringUTF(src.UTF8Characters);
+ result.l = javaString;
+ }
+ } else if (result.l == 0)
+ bzero (&result, sizeof(jvalue)); // Handle it the same as a void case
+ }
+ break;
+
+ case boolean_type:
+ {
+ if (type == NPVariantType_Bool)
+ result.z = NPVARIANT_TO_BOOLEAN(value);
+ else
+ bzero(&result, sizeof(jvalue)); // as void case
+ }
+ break;
+
+ case byte_type:
+ {
+ if (type == NPVariantType_Int32)
+ result.b = (char)NPVARIANT_TO_INT32(value);
+ else
+ bzero(&result, sizeof(jvalue));
+ }
+ break;
+
+ case char_type:
+ {
+ if (type == NPVariantType_Int32)
+ result.c = (char)NPVARIANT_TO_INT32(value);
+ else
+ bzero(&result, sizeof(jvalue));
+ }
+ break;
+
+ case short_type:
+ {
+ if (type == NPVariantType_Int32)
+ result.s = (jshort)NPVARIANT_TO_INT32(value);
+ else
+ bzero(&result, sizeof(jvalue));
+ }
+ break;
+
+ case int_type:
+ {
+ if (type == NPVariantType_Int32)
+ result.i = (jint)NPVARIANT_TO_INT32(value);
+ else
+ bzero(&result, sizeof(jvalue));
+ }
+ break;
+
+ case long_type:
+ {
+ if (type == NPVariantType_Int32)
+ result.j = (jlong)NPVARIANT_TO_INT32(value);
+ else if (type == NPVariantType_Double)
+ result.j = (jlong)NPVARIANT_TO_DOUBLE(value);
+ else
+ bzero(&result, sizeof(jvalue));
+ }
+ break;
+
+ case float_type:
+ {
+ if (type == NPVariantType_Int32)
+ result.j = (jfloat)NPVARIANT_TO_INT32(value);
+ else if (type == NPVariantType_Double)
+ result.j = (jfloat)NPVARIANT_TO_DOUBLE(value);
+ else
+ bzero(&result, sizeof(jvalue));
+ }
+ break;
+
+ case double_type:
+ {
+ if (type == NPVariantType_Int32)
+ result.j = (jdouble)NPVARIANT_TO_INT32(value);
+ else if (type == NPVariantType_Double)
+ result.j = (jdouble)NPVARIANT_TO_DOUBLE(value);
+ else
+ bzero(&result, sizeof(jvalue));
+ }
+ break;
+
+ break;
+
+ case invalid_type:
+ default:
+ case void_type:
+ {
+ bzero(&result, sizeof(jvalue));
+ }
+ break;
+ }
+ return result;
+}
+
+
+void convertJValueToNPVariant(jvalue value, JNIType jniType, const char* javaTypeName, NPVariant* result)
+{
+ switch (jniType) {
+ case void_type:
+ {
+ VOID_TO_NPVARIANT(*result);
+ }
+ break;
+
+ case object_type:
+ {
+ if (value.l != 0) {
+ if (strcmp(javaTypeName, "java.lang.String") == 0) {
+ const char* v = getCharactersFromJString((jstring)value.l);
+ // s is freed in NPN_ReleaseVariantValue (see npruntime.cpp)
+ const char* s = strdup(v);
+ releaseCharactersForJString((jstring)value.l, v);
+ STRINGZ_TO_NPVARIANT(s, *result);
+ } else {
+ OBJECT_TO_NPVARIANT(JavaInstanceToNPObject(new JavaInstance(value.l)), *result);
+ }
+ }
+ else {
+ VOID_TO_NPVARIANT(*result);
+ }
+ }
+ break;
+
+ case boolean_type:
+ {
+ BOOLEAN_TO_NPVARIANT(value.z, *result);
+ }
+ break;
+
+ case byte_type:
+ {
+ INT32_TO_NPVARIANT(value.b, *result);
+ }
+ break;
+
+ case char_type:
+ {
+ INT32_TO_NPVARIANT(value.c, *result);
+ }
+ break;
+
+ case short_type:
+ {
+ INT32_TO_NPVARIANT(value.s, *result);
+ }
+ break;
+
+ case int_type:
+ {
+ INT32_TO_NPVARIANT(value.i, *result);
+ }
+ break;
+
+ // TODO: Check if cast to double is needed.
+ case long_type:
+ {
+ DOUBLE_TO_NPVARIANT(value.j, *result);
+ }
+ break;
+
+ case float_type:
+ {
+ DOUBLE_TO_NPVARIANT(value.f, *result);
+ }
+ break;
+
+ case double_type:
+ {
+ DOUBLE_TO_NPVARIANT(value.d, *result);
+ }
+ break;
+
+ case invalid_type:
+ default:
+ {
+ VOID_TO_NPVARIANT(*result);
+ }
+ break;
+ }
+}
+
+} // end of namespace Bindings
+
+} // end of namespace JSC
diff --git a/WebCore/bridge/jni/v8/jni_utility_private.h b/WebCore/bridge/jni/v8/jni_utility_private.h
new file mode 100644
index 0000000..397de7b
--- /dev/null
+++ b/WebCore/bridge/jni/v8/jni_utility_private.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2009, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _JNI_UTILITY_PRIVATE_H_
+#define _JNI_UTILITY_PRIVATE_H_
+
+#include "jni_utility.h"
+#include "npruntime.h"
+
+namespace JSC {
+
+namespace Bindings {
+
+jvalue convertNPVariantToJValue(NPVariant, JNIType, const char* javaClassName);
+void convertJValueToNPVariant(jvalue, JNIType, const char* javaClassName, NPVariant*);
+
+} // namespace Bindings
+
+} // namespace JSC
+
+#endif // _JNI_UTILITY_H_