#ifndef _JNI_INSTANCE_H_
#define _JNI_INSTANCE_H_
#include <CoreFoundation/CoreFoundation.h>
#include <JavaVM/jni.h>
#include <JavaScriptCore/runtime.h>
namespace KJS {
namespace Bindings {
class JavaClass;
class JObjectWrapper
{
friend class JavaArray;
friend class JavaInstance;
friend class JavaMethod;
protected:
JObjectWrapper(jobject instance);
void ref() { _ref++; }
void deref() {
_ref--;
if (_ref == 0)
delete this;
}
~JObjectWrapper();
jobject _instance;
private:
JNIEnv *_env;
unsigned int _ref;
};
class JavaInstance : public Instance
{
public:
JavaInstance (jobject instance, const RootObject *r);
~JavaInstance ();
virtual Class *getClass() const;
JavaInstance (const JavaInstance &other);
JavaInstance &operator=(const JavaInstance &other){
if (this == &other)
return *this;
JObjectWrapper *_oldInstance = _instance;
_instance = other._instance;
_instance->ref();
_oldInstance->deref();
_class = other._class;
return *this;
};
virtual void begin();
virtual void end();
virtual Value valueOf() const;
virtual Value defaultValue (Type hint) const;
virtual Value invokeMethod (ExecState *exec, const MethodList &method, const List &args);
virtual Value invokeDefaultMethod (ExecState *exec, const List &args);
jobject javaInstance() const { return _instance->_instance; }
Value stringValue() const;
Value numberValue() const;
Value booleanValue() const;
private:
JObjectWrapper *_instance;
mutable JavaClass *_class;
};
}
}
#endif