JavaClassJobjectV8.cpp [plain text]
#include "config.h"
#include "JavaClassJobjectV8.h"
#if ENABLE(JAVA_BRIDGE)
#include "JavaFieldJobjectV8.h"
#include "JavaMethodJobject.h"
using namespace JSC::Bindings;
JavaClassJobject::JavaClassJobject(jobject anInstance)
{
jobject aClass = callJNIMethod<jobject>(anInstance, "getClass", "()Ljava/lang/Class;");
if (!aClass) {
LOG_ERROR("unable to call getClass on instance %p", anInstance);
return;
}
JNIEnv* env = getJNIEnv();
jarray fields = static_cast<jarray>(callJNIMethod<jobject>(aClass, "getFields", "()[Ljava/lang/reflect/Field;"));
int numFields = env->GetArrayLength(fields);
for (int i = 0; i < numFields; i++) {
jobject aJField = env->GetObjectArrayElement(static_cast<jobjectArray>(fields), i);
JavaField* aField = new JavaFieldJobject(env, aJField); m_fields.set(aField->name(), aField);
env->DeleteLocalRef(aJField);
}
jarray methods = static_cast<jarray>(callJNIMethod<jobject>(aClass, "getMethods", "()[Ljava/lang/reflect/Method;"));
int numMethods = env->GetArrayLength(methods);
for (int i = 0; i < numMethods; i++) {
jobject aJMethod = env->GetObjectArrayElement(static_cast<jobjectArray>(methods), i);
JavaMethod* aMethod = new JavaMethodJobject(env, aJMethod); MethodList* methodList = m_methods.get(aMethod->name());
if (!methodList) {
methodList = new MethodList();
m_methods.set(aMethod->name(), methodList);
}
methodList->append(aMethod);
env->DeleteLocalRef(aJMethod);
}
env->DeleteLocalRef(fields);
env->DeleteLocalRef(methods);
env->DeleteLocalRef(aClass);
}
JavaClassJobject::~JavaClassJobject()
{
deleteAllValues(m_fields);
m_fields.clear();
MethodListMap::const_iterator end = m_methods.end();
for (MethodListMap::const_iterator it = m_methods.begin(); it != end; ++it) {
const MethodList* methodList = it->second;
deleteAllValues(*methodList);
delete methodList;
}
m_methods.clear();
}
MethodList JavaClassJobject::methodsNamed(const char* name) const
{
MethodList* methodList = m_methods.get(name);
if (methodList)
return *methodList;
return MethodList();
}
JavaField* JavaClassJobject::fieldNamed(const char* name) const
{
return m_fields.get(name);
}
#endif // ENABLE(JAVA_BRIDGE)