diff options
author | Android (Google) Code Review <android-gerrit@google.com> | 2009-12-08 03:48:26 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-12-08 03:48:26 -0800 |
commit | bfe6eebb3416ce4745bb79739e718382cb75e41b (patch) | |
tree | b7dc95abd9f97674c46396c96f335b1546415785 | |
parent | 74757b62fce144f27c25cc7744df82cd7411b2dc (diff) | |
parent | a63603fa9165021c9f53483f7bcc7302c2e8915a (diff) | |
download | external_webkit-bfe6eebb3416ce4745bb79739e718382cb75e41b.zip external_webkit-bfe6eebb3416ce4745bb79739e718382cb75e41b.tar.gz external_webkit-bfe6eebb3416ce4745bb79739e718382cb75e41b.tar.bz2 |
Merge change I640d5ca9 into eclair-mr2
* changes:
Merges V8 version of jni_utility with JSC version at WebCore/bridge/jni.
-rw-r--r-- | Android.mk | 10 | ||||
-rw-r--r-- | V8Binding/jni/jni_instance.h | 2 | ||||
-rw-r--r-- | V8Binding/jni/jni_utility.cpp | 549 | ||||
-rw-r--r-- | V8Binding/jni/jni_utility.h | 280 | ||||
-rw-r--r-- | WebCore/Android.v8bindings.mk | 4 | ||||
-rw-r--r-- | WebCore/bridge/jni/v8/jni_utility_private.cpp | 258 | ||||
-rw-r--r-- | WebCore/bridge/jni/v8/jni_utility_private.h | 43 |
7 files changed, 314 insertions, 832 deletions
@@ -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_ |