From: Steve Block Date: Thu, 21 Jan 2010 19:12:36 +0000 (+0000) Subject: V8 can now use WebCore/bridge/jni/JNIBridge.cpp X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=fbd2688ec2a4d79adf95888484958ee80341a5a2;p=android-x86%2Fexternal-webkit.git V8 can now use WebCore/bridge/jni/JNIBridge.cpp JNIBridge.cpp is now used by both JSC and V8 This removes the last file from V8Bindings $ diff WebCore/bridge/jni/JNIBridge.cpp V8Binding/jni/jni_runtime.cpp 2d1 < * Copyright (C) 2003, 2004, 2005, 2007, 2009 Apple Inc. All rights reserved. 28c27 < #include "JNIBridge.h" --- > #include "jni_runtime.h" 30,32c29 < #if ENABLE(MAC_JAVA_BRIDGE) < < #include "CString.h" --- > #include "JNIUtility.h" 35,45d31 < < #ifdef NDEBUG < #define JS_LOG(formatAndArgs...) ((void)0) < #else < #define JS_LOG(formatAndArgs...) { \ < fprintf(stderr, "%s:%d -- %s: ", __FILE__, __LINE__, __FUNCTION__); \ < fprintf(stderr, formatAndArgs); \ < } < #endif < < using namespace JSC; 49d34 < 106,109d90 < #if USE(JSC) < ASSERT(JSLock::lockCount() > 0); < #endif < 127,130d107 < #if USE(JSC) < JSLock lock(SilenceAssertionsOnly); < #endif < 177,178d153 < < #endif // ENABLE(MAC_JAVA_BRIDGE) Change-Id: I3f0aabc5af56083aa950eca1609b2fe9b46726c9 --- diff --git a/Android.mk b/Android.mk index e24770e99..c91ec0802 100644 --- a/Android.mk +++ b/Android.mk @@ -171,11 +171,6 @@ include $(LOCAL_PATH)/Android.jscbindings.mk endif ifeq ($(JAVASCRIPT_ENGINE),v8) include $(LOCAL_PATH)/Android.v8bindings.mk -# TODO: We should use the WebCore JNI code instead. -JNI_PATH := V8Binding/jni -JNI_SRC_FILES := \ - jni_runtime.cpp -WEBKIT_SRC_FILES += $(addprefix $(JNI_PATH)/,$(JNI_SRC_FILES)) endif WEBKIT_SRC_FILES += $(addprefix $d/,$(LOCAL_SRC_FILES)) LOCAL_C_INCLUDES += $(BINDING_C_INCLUDES) diff --git a/V8Binding/jni/jni_runtime.cpp b/V8Binding/jni/jni_runtime.cpp deleted file mode 100644 index edb1b2f44..000000000 --- a/V8Binding/jni/jni_runtime.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright 2010, 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 "JNIBridge.h" - -#include "JNIUtility.h" -#include "StringBuilder.h" - -using namespace JSC::Bindings; -using namespace WebCore; - -JavaParameter::JavaParameter(JNIEnv* env, jstring type) -{ - m_type = JavaString(env, type); - m_JNIType = JNITypeFromClassName(m_type.UTF8String()); -} - -JavaMethod::JavaMethod(JNIEnv* env, jobject aMethod) -{ - // Get return type - jobject returnType = callJNIMethod(aMethod, "getReturnType", "()Ljava/lang/Class;"); - jstring returnTypeName = static_cast(callJNIMethod(returnType, "getName", "()Ljava/lang/String;")); - m_returnType = JavaString(env, returnTypeName); - m_JNIReturnType = JNITypeFromClassName(m_returnType.UTF8String()); - env->DeleteLocalRef(returnType); - env->DeleteLocalRef(returnTypeName); - - // Get method name - jstring methodName = static_cast(callJNIMethod(aMethod, "getName", "()Ljava/lang/String;")); - m_name = JavaString(env, methodName); - env->DeleteLocalRef(methodName); - - // Get parameters - jarray jparameters = static_cast(callJNIMethod(aMethod, "getParameterTypes", "()[Ljava/lang/Class;")); - m_numParameters = env->GetArrayLength(jparameters); - m_parameters = new JavaParameter[m_numParameters]; - - for (int i = 0; i < m_numParameters; i++) { - jobject aParameter = env->GetObjectArrayElement(static_cast(jparameters), i); - jstring parameterName = static_cast(callJNIMethod(aParameter, "getName", "()Ljava/lang/String;")); - m_parameters[i] = JavaParameter(env, parameterName); - env->DeleteLocalRef(aParameter); - env->DeleteLocalRef(parameterName); - } - env->DeleteLocalRef(jparameters); - - // Created lazily. - m_signature = 0; - m_methodID = 0; - - jclass modifierClass = env->FindClass("java/lang/reflect/Modifier"); - int modifiers = callJNIMethod(aMethod, "getModifiers", "()I"); - m_isStatic = static_cast(callJNIStaticMethod(modifierClass, "isStatic", "(I)Z", modifiers)); - env->DeleteLocalRef(modifierClass); -} - -JavaMethod::~JavaMethod() -{ - if (m_signature) - free(m_signature); - delete[] m_parameters; -}; - -// JNI method signatures use '/' between components of a class name, but -// we get '.' between components from the reflection API. -static void appendClassName(StringBuilder& builder, const char* className) -{ - char* c = strdup(className); - - char* result = c; - while (*c) { - if (*c == '.') - *c = '/'; - c++; - } - - builder.append(result); - - free(result); -} - -const char* JavaMethod::signature() const -{ - if (!m_signature) { - StringBuilder signatureBuilder; - signatureBuilder.append("("); - for (int i = 0; i < m_numParameters; i++) { - JavaParameter* aParameter = parameterAt(i); - JNIType type = aParameter->getJNIType(); - if (type == array_type) - appendClassName(signatureBuilder, aParameter->type()); - else { - signatureBuilder.append(signatureFromPrimitiveType(type)); - if (type == object_type) { - appendClassName(signatureBuilder, aParameter->type()); - signatureBuilder.append(";"); - } - } - } - signatureBuilder.append(")"); - - const char* returnType = m_returnType.UTF8String(); - if (m_JNIReturnType == array_type) - appendClassName(signatureBuilder, returnType); - else { - signatureBuilder.append(signatureFromPrimitiveType(m_JNIReturnType)); - if (m_JNIReturnType == object_type) { - appendClassName(signatureBuilder, returnType); - signatureBuilder.append(";"); - } - } - - String signatureString = signatureBuilder.toString(); - m_signature = strdup(signatureString.utf8().data()); - } - - return m_signature; -} - -JNIType JavaMethod::JNIReturnType() const -{ - return m_JNIReturnType; -} - -jmethodID JavaMethod::methodID(jobject obj) const -{ - if (!m_methodID) - m_methodID = getMethodID(obj, m_name.UTF8String(), signature()); - return m_methodID; -} diff --git a/WebCore/Android.v8bindings.mk b/WebCore/Android.v8bindings.mk index 6aa18d463..ffbcc2040 100644 --- a/WebCore/Android.v8bindings.mk +++ b/WebCore/Android.v8bindings.mk @@ -175,6 +175,7 @@ LOCAL_SRC_FILES += \ bindings/v8/custom/V8XMLSerializerConstructor.cpp LOCAL_SRC_FILES += \ + bridge/jni/JNIBridge.cpp \ bridge/jni/JNIUtility.cpp \ bridge/jni/v8/JNIBridgeV8.cpp \ bridge/jni/v8/JNIUtilityPrivate.cpp \