diff options
Diffstat (limited to 'Source/WebCore/bridge/jni')
14 files changed, 248 insertions, 91 deletions
diff --git a/Source/WebCore/bridge/jni/JavaMethod.h b/Source/WebCore/bridge/jni/JavaMethod.h index f15b653..5068693 100644 --- a/Source/WebCore/bridge/jni/JavaMethod.h +++ b/Source/WebCore/bridge/jni/JavaMethod.h @@ -42,6 +42,8 @@ typedef const char* RuntimeType; class JavaMethod : public Method { public: + virtual ~JavaMethod() {} + virtual String name() const = 0; virtual RuntimeType returnTypeClassName() const = 0; virtual String parameterAt(int) const = 0; diff --git a/Source/WebCore/bridge/jni/JobjectWrapper.h b/Source/WebCore/bridge/jni/JobjectWrapper.h index 28ce56e..9cc4b27 100644 --- a/Source/WebCore/bridge/jni/JobjectWrapper.h +++ b/Source/WebCore/bridge/jni/JobjectWrapper.h @@ -38,7 +38,9 @@ namespace Bindings { class JobjectWrapper { friend class JavaArray; friend class JavaField; +friend class JavaFieldJobject; friend class JavaInstance; +friend class JavaInstanceJobject; public: jobject instance() const { return m_instance; } diff --git a/Source/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp b/Source/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp index 806efa6..ab64132 100644 --- a/Source/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp +++ b/Source/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp @@ -124,7 +124,7 @@ public: ASSERT(inherits(&s_info)); } - static PassRefPtr<Structure> createStructure(JSGlobalData& globalData, JSValue prototype) + static Structure* createStructure(JSGlobalData& globalData, JSValue prototype) { return Structure::create(globalData, prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info); } diff --git a/Source/WebCore/bridge/jni/jsc/JavaRuntimeObject.h b/Source/WebCore/bridge/jni/jsc/JavaRuntimeObject.h index 03f116f..8a3612f 100644 --- a/Source/WebCore/bridge/jni/jsc/JavaRuntimeObject.h +++ b/Source/WebCore/bridge/jni/jsc/JavaRuntimeObject.h @@ -42,7 +42,7 @@ public: static const ClassInfo s_info; - static PassRefPtr<Structure> createStructure(JSGlobalData& globalData, JSValue prototype) + static Structure* createStructure(JSGlobalData& globalData, JSValue prototype) { return Structure::create(globalData, prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info); } diff --git a/Source/WebCore/bridge/jni/v8/JNIUtilityPrivate.cpp b/Source/WebCore/bridge/jni/v8/JNIUtilityPrivate.cpp index e2ef2ce..4c9e240 100644 --- a/Source/WebCore/bridge/jni/v8/JNIUtilityPrivate.cpp +++ b/Source/WebCore/bridge/jni/v8/JNIUtilityPrivate.cpp @@ -28,7 +28,7 @@ #if ENABLE(JAVA_BRIDGE) -#include "JavaInstanceV8.h" +#include "JavaInstanceJobjectV8.h" #include "JavaNPObjectV8.h" #if PLATFORM(ANDROID) #include "npruntime_impl.h" @@ -424,7 +424,7 @@ JavaValue jvalueToJavaValue(const jvalue& value, const JavaType& type) case JavaTypeVoid: break; case JavaTypeObject: - result.m_objectValue = new JavaInstance(value.l); + result.m_objectValue = new JavaInstanceJobject(value.l); break; case JavaTypeString: { @@ -476,8 +476,11 @@ jvalue javaValueToJvalue(const JavaValue& value) case JavaTypeArray: #endif case JavaTypeObject: - if (value.m_objectValue) - result.l = value.m_objectValue->javaInstance(); + if (value.m_objectValue) { + // This method is used only by JavaInstanceJobject, so we know the + // derived type of the object. + result.l = static_cast<JavaInstanceJobject*>(value.m_objectValue.get())->javaInstance(); + } break; case JavaTypeString: // This creates a local reference to a new String object, which will diff --git a/Source/WebCore/bridge/jni/v8/JavaClassV8.cpp b/Source/WebCore/bridge/jni/v8/JavaClassJobjectV8.cpp index 24d05f3..40bfd63 100644 --- a/Source/WebCore/bridge/jni/v8/JavaClassV8.cpp +++ b/Source/WebCore/bridge/jni/v8/JavaClassJobjectV8.cpp @@ -24,16 +24,16 @@ */ #include "config.h" -#include "JavaClassV8.h" +#include "JavaClassJobjectV8.h" #if ENABLE(JAVA_BRIDGE) -#include "JavaFieldV8.h" +#include "JavaFieldJobjectV8.h" #include "JavaMethodJobject.h" using namespace JSC::Bindings; -JavaClass::JavaClass(jobject anInstance) +JavaClassJobject::JavaClassJobject(jobject anInstance) { jobject aClass = callJNIMethod<jobject>(anInstance, "getClass", "()Ljava/lang/Class;"); @@ -42,34 +42,28 @@ JavaClass::JavaClass(jobject anInstance) return; } - int i; JNIEnv* env = getJNIEnv(); // Get the fields jarray fields = static_cast<jarray>(callJNIMethod<jobject>(aClass, "getFields", "()[Ljava/lang/reflect/Field;")); int numFields = env->GetArrayLength(fields); - for (i = 0; i < numFields; i++) { + for (int i = 0; i < numFields; i++) { jobject aJField = env->GetObjectArrayElement(static_cast<jobjectArray>(fields), i); - JavaField* aField = new JavaField(env, aJField); // deleted in the JavaClass destructor - { - m_fields.set(aField->name().utf8(), aField); - } + JavaField* aField = new JavaFieldJobject(env, aJField); // deleted in the JavaClass destructor + m_fields.set(aField->name(), aField); env->DeleteLocalRef(aJField); } // Get the methods jarray methods = static_cast<jarray>(callJNIMethod<jobject>(aClass, "getMethods", "()[Ljava/lang/reflect/Method;")); int numMethods = env->GetArrayLength(methods); - for (i = 0; i < numMethods; i++) { + for (int i = 0; i < numMethods; i++) { jobject aJMethod = env->GetObjectArrayElement(static_cast<jobjectArray>(methods), i); JavaMethod* aMethod = new JavaMethodJobject(env, aJMethod); // deleted in the JavaClass destructor - MethodList* methodList; - { - methodList = m_methods.get(aMethod->name()); - if (!methodList) { - methodList = new MethodList(); - m_methods.set(aMethod->name(), methodList); - } + MethodList* methodList = m_methods.get(aMethod->name()); + if (!methodList) { + methodList = new MethodList(); + m_methods.set(aMethod->name(), methodList); } methodList->append(aMethod); env->DeleteLocalRef(aJMethod); @@ -79,7 +73,7 @@ JavaClass::JavaClass(jobject anInstance) env->DeleteLocalRef(aClass); } -JavaClass::~JavaClass() +JavaClassJobject::~JavaClassJobject() { deleteAllValues(m_fields); m_fields.clear(); @@ -93,7 +87,7 @@ JavaClass::~JavaClass() m_methods.clear(); } -MethodList JavaClass::methodsNamed(const char* name) const +MethodList JavaClassJobject::methodsNamed(const char* name) const { MethodList* methodList = m_methods.get(name); @@ -102,7 +96,7 @@ MethodList JavaClass::methodsNamed(const char* name) const return MethodList(); } -JavaField* JavaClass::fieldNamed(const char* name) const +JavaField* JavaClassJobject::fieldNamed(const char* name) const { return m_fields.get(name); } diff --git a/Source/WebCore/bridge/jni/v8/JavaClassJobjectV8.h b/Source/WebCore/bridge/jni/v8/JavaClassJobjectV8.h new file mode 100644 index 0000000..d27ca97 --- /dev/null +++ b/Source/WebCore/bridge/jni/v8/JavaClassJobjectV8.h @@ -0,0 +1,59 @@ +/* + * 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: + * * 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 JavaClassJobjectV8_h +#define JavaClassJobjectV8_h + +#if ENABLE(JAVA_BRIDGE) + +#include "JNIUtility.h" +#include "JavaClassV8.h" + +namespace JSC { + +namespace Bindings { + +class JavaClassJobject : public JavaClass { +public: + JavaClassJobject(jobject); + virtual ~JavaClassJobject(); + + // JavaClass implementation + virtual MethodList methodsNamed(const char* name) const; + virtual JavaField* fieldNamed(const char* name) const; + +private: + typedef HashMap<WTF::String, MethodList*> MethodListMap; + MethodListMap m_methods; + FieldMap m_fields; +}; + +} // namespace Bindings + +} // namespace JSC + +#endif // ENABLE(JAVA_BRIDGE) + +#endif // JavaClassJobjectV8_h diff --git a/Source/WebCore/bridge/jni/v8/JavaClassV8.h b/Source/WebCore/bridge/jni/v8/JavaClassV8.h index 6b03b2d..e60ca2d 100644 --- a/Source/WebCore/bridge/jni/v8/JavaClassV8.h +++ b/Source/WebCore/bridge/jni/v8/JavaClassV8.h @@ -28,11 +28,10 @@ #if ENABLE(JAVA_BRIDGE) -#include "JNIUtility.h" -#include "PlatformString.h" #include <wtf/HashMap.h> #include <wtf/Vector.h> #include <wtf/text/StringHash.h> +#include <wtf/text/WTFString.h> namespace JSC { @@ -42,20 +41,14 @@ class JavaField; class JavaMethod; typedef Vector<JavaMethod*> MethodList; -typedef HashMap<WTF::String, MethodList*> MethodListMap; typedef HashMap<WTF::String, JavaField*> FieldMap; class JavaClass { public: - JavaClass(jobject); - ~JavaClass(); + virtual ~JavaClass() {} - MethodList methodsNamed(const char* name) const; - JavaField* fieldNamed(const char* name) const; - -private: - MethodListMap m_methods; - FieldMap m_fields; + virtual MethodList methodsNamed(const char* name) const = 0; + virtual JavaField* fieldNamed(const char* name) const = 0; }; } // namespace Bindings diff --git a/Source/WebCore/bridge/jni/v8/JavaFieldV8.cpp b/Source/WebCore/bridge/jni/v8/JavaFieldJobjectV8.cpp index 2a6dd0b..0fe5837 100644 --- a/Source/WebCore/bridge/jni/v8/JavaFieldV8.cpp +++ b/Source/WebCore/bridge/jni/v8/JavaFieldJobjectV8.cpp @@ -24,13 +24,13 @@ */ #include "config.h" -#include "JavaFieldV8.h" +#include "JavaFieldJobjectV8.h" #if ENABLE(JAVA_BRIDGE) using namespace JSC::Bindings; -JavaField::JavaField(JNIEnv* env, jobject aField) +JavaFieldJobject::JavaFieldJobject(JNIEnv* env, jobject aField) { // Get field type jobject fieldType = callJNIMethod<jobject>(aField, "getType", "()Ljava/lang/Class;"); diff --git a/Source/WebCore/bridge/jni/v8/JavaFieldJobjectV8.h b/Source/WebCore/bridge/jni/v8/JavaFieldJobjectV8.h new file mode 100644 index 0000000..32c7857 --- /dev/null +++ b/Source/WebCore/bridge/jni/v8/JavaFieldJobjectV8.h @@ -0,0 +1,61 @@ +/* + * 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: + * * 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 JavaFieldJobjectV8_h +#define JavaFieldJobjectV8_h + +#if ENABLE(JAVA_BRIDGE) + +#include "JavaFieldV8.h" +#include "JavaString.h" +#include "JobjectWrapper.h" + +namespace JSC { + +namespace Bindings { + +class JavaFieldJobject : public JavaField { +public: + JavaFieldJobject(JNIEnv*, jobject); + + // JavaField implementation + virtual String name() const { return m_name.impl(); } + virtual const char* typeClassName() const { return m_typeClassName.utf8(); } + virtual JavaType type() const { return m_type; } + +private: + JavaString m_name; + JavaString m_typeClassName; + JavaType m_type; + RefPtr<JobjectWrapper> m_field; +}; + +} // namespace Bindings + +} // namespace JSC + +#endif // ENABLE(JAVA_BRIDGE) + +#endif // JavaFieldJobjectV8_h diff --git a/Source/WebCore/bridge/jni/v8/JavaFieldV8.h b/Source/WebCore/bridge/jni/v8/JavaFieldV8.h index defed60..3c24cf5 100644 --- a/Source/WebCore/bridge/jni/v8/JavaFieldV8.h +++ b/Source/WebCore/bridge/jni/v8/JavaFieldV8.h @@ -28,8 +28,8 @@ #if ENABLE(JAVA_BRIDGE) -#include "JavaString.h" -#include "JobjectWrapper.h" +#include "JNIUtility.h" +#include <wtf/text/WTFString.h> namespace JSC { @@ -37,17 +37,11 @@ namespace Bindings { class JavaField { public: - JavaField(JNIEnv*, jobject aField); + virtual ~JavaField() {} - const JavaString& name() const { return m_name; } - const char* typeClassName() const { return m_typeClassName.utf8(); } - JavaType type() const { return m_type; } - -private: - JavaString m_name; - JavaString m_typeClassName; - JavaType m_type; - RefPtr<JobjectWrapper> m_field; + virtual String name() const = 0; + virtual const char* typeClassName() const = 0; + virtual JavaType type() const = 0; }; } // namespace Bindings diff --git a/Source/WebCore/bridge/jni/v8/JavaInstanceV8.cpp b/Source/WebCore/bridge/jni/v8/JavaInstanceJobjectV8.cpp index d1075ae..8221eff 100644 --- a/Source/WebCore/bridge/jni/v8/JavaInstanceV8.cpp +++ b/Source/WebCore/bridge/jni/v8/JavaInstanceJobjectV8.cpp @@ -25,52 +25,46 @@ */ #include "config.h" -#include "JavaInstanceV8.h" +#include "JavaInstanceJobjectV8.h" #if ENABLE(JAVA_BRIDGE) #include "JNIUtilityPrivate.h" -#include "JavaClassV8.h" +#include "JavaClassJobjectV8.h" #include "JavaFieldV8.h" #include "JavaMethod.h" #include <wtf/OwnArrayPtr.h> +#include <wtf/PassOwnPtr.h> #include <wtf/text/CString.h> using namespace JSC::Bindings; -JavaInstance::JavaInstance(jobject instance) +JavaInstanceJobject::JavaInstanceJobject(jobject instance) + : m_instance(new JobjectWrapper(instance)) { - m_instance = new JobjectWrapper(instance); - m_class = 0; -} - -JavaInstance::~JavaInstance() -{ - m_instance = 0; - delete m_class; } #define NUM_LOCAL_REFS 64 -void JavaInstance::virtualBegin() +void JavaInstanceJobject::begin() { getJNIEnv()->PushLocalFrame(NUM_LOCAL_REFS); } -void JavaInstance::virtualEnd() +void JavaInstanceJobject::end() { getJNIEnv()->PopLocalFrame(0); } -JavaClass* JavaInstance::getClass() const +JavaClass* JavaInstanceJobject::getClass() const { if (!m_class) - m_class = new JavaClass(javaInstance()); - return m_class; + m_class = adoptPtr(new JavaClassJobject(javaInstance())); + return m_class.get(); } -JavaValue JavaInstance::invokeMethod(const JavaMethod* method, JavaValue* args) +JavaValue JavaInstanceJobject::invokeMethod(const JavaMethod* method, JavaValue* args) { ASSERT(getClass()->methodsNamed(method->name().utf8().data()).find(method) != notFound); unsigned int numParams = method->numParameters(); @@ -81,10 +75,10 @@ JavaValue JavaInstance::invokeMethod(const JavaMethod* method, JavaValue* args) return jvalueToJavaValue(result, method->returnType()); } -JavaValue JavaInstance::getField(const JavaField* field) +JavaValue JavaInstanceJobject::getField(const JavaField* field) { - ASSERT(getClass()->fieldNamed(field->name().utf8()) == field); - return jvalueToJavaValue(getJNIField(javaInstance(), field->type(), field->name().utf8(), field->typeClassName()), field->type()); + ASSERT(getClass()->fieldNamed(field->name().utf8().data()) == field); + return jvalueToJavaValue(getJNIField(javaInstance(), field->type(), field->name().utf8().data(), field->typeClassName()), field->type()); } #endif // ENABLE(JAVA_BRIDGE) diff --git a/Source/WebCore/bridge/jni/v8/JavaInstanceJobjectV8.h b/Source/WebCore/bridge/jni/v8/JavaInstanceJobjectV8.h new file mode 100644 index 0000000..9f86037 --- /dev/null +++ b/Source/WebCore/bridge/jni/v8/JavaInstanceJobjectV8.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2003, 2008, 2010 Apple Inc. All rights reserved. + * 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: + * * 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 JavaInstanceJobjectV8_h +#define JavaInstanceJobjectV8_h + +#if ENABLE(JAVA_BRIDGE) + +#include "JNIUtility.h" +#include "JavaInstanceV8.h" +#include "JobjectWrapper.h" + +#include <wtf/OwnPtr.h> +#include <wtf/RefPtr.h> + +using namespace WTF; + +namespace JSC { + +namespace Bindings { + +class JavaInstanceJobject : public JavaInstance { +public: + JavaInstanceJobject(jobject instance); + + // JavaInstance implementation + virtual JavaClass* getClass() const; + virtual JavaValue invokeMethod(const JavaMethod*, JavaValue* args); + virtual JavaValue getField(const JavaField*); + virtual void begin(); + virtual void end(); + + jobject javaInstance() const { return m_instance->m_instance; } + +protected: + RefPtr<JobjectWrapper> m_instance; + mutable OwnPtr<JavaClass> m_class; +}; + +} // namespace Bindings + +} // namespace JSC + +#endif // ENABLE(JAVA_BRIDGE) + +#endif // JavaInstanceJobjectV8_h diff --git a/Source/WebCore/bridge/jni/v8/JavaInstanceV8.h b/Source/WebCore/bridge/jni/v8/JavaInstanceV8.h index b1150f8..7436de7 100644 --- a/Source/WebCore/bridge/jni/v8/JavaInstanceV8.h +++ b/Source/WebCore/bridge/jni/v8/JavaInstanceV8.h @@ -29,13 +29,8 @@ #if ENABLE(JAVA_BRIDGE) -#include "JNIUtility.h" #include "JavaValueV8.h" -#include "JobjectWrapper.h" -#include "npruntime.h" - #include <wtf/RefCounted.h> -#include <wtf/RefPtr.h> using namespace WTF; @@ -49,28 +44,19 @@ class JavaMethod; class JavaInstance : public RefCounted<JavaInstance> { public: - JavaInstance(jobject instance); - virtual ~JavaInstance(); + virtual ~JavaInstance() {} - JavaClass* getClass() const; + virtual JavaClass* getClass() const = 0; // args must be an array of length greater than or equal to the number of // arguments expected by the method. - JavaValue invokeMethod(const JavaMethod*, JavaValue* args); - JavaValue getField(const JavaField*); - jobject javaInstance() const { return m_instance->m_instance; } + virtual JavaValue invokeMethod(const JavaMethod*, JavaValue* args) = 0; + virtual JavaValue getField(const JavaField*) = 0; // These functions are called before and after the main entry points into // the native implementations. They can be used to establish and cleanup // any needed state. - void begin() { virtualBegin(); } - void end() { virtualEnd(); } - -protected: - RefPtr<JobjectWrapper> m_instance; - mutable JavaClass* m_class; - - virtual void virtualBegin(); - virtual void virtualEnd(); + virtual void begin() = 0; + virtual void end() = 0; }; } // namespace Bindings |