JavaClass::JavaClass(jobject anInstance) { jobject aClass = callJNIMethod<jobject>(anInstance, "getClass", "()Ljava/lang/Class;"); if (!aClass) { LOG_ERROR("Unable to call getClass on instance %p", anInstance); m_name = fastStrDup("<Unknown>"); return; } if (jstring className = (jstring)callJNIMethod<jobject>(aClass, "getName", "()Ljava/lang/String;")) { const char* classNameC = getCharactersFromJString(className); m_name = fastStrDup(classNameC); releaseCharactersForJString(className, classNameC); } else m_name = fastStrDup("<Unknown>"); int i; JNIEnv* env = getJNIEnv(); // Get the fields if (jarray fields = (jarray)callJNIMethod<jobject>(aClass, "getFields", "()[Ljava/lang/reflect/Field;")) { int numFields = env->GetArrayLength(fields); for (i = 0; i < numFields; i++) { jobject aJField = env->GetObjectArrayElement((jobjectArray)fields, i); JavaField* aField = new JavaField(env, aJField); // deleted in the JavaClass destructor { JSLock lock(SilenceAssertionsOnly); m_fields.set(((UString)aField->name()).rep(), aField); } env->DeleteLocalRef(aJField); } env->DeleteLocalRef(fields); } // Get the methods if (jarray methods = (jarray)callJNIMethod<jobject>(aClass, "getMethods", "()[Ljava/lang/reflect/Method;")) { int numMethods = env->GetArrayLength(methods); for (i = 0; i < numMethods; i++) { jobject aJMethod = env->GetObjectArrayElement((jobjectArray)methods, i); JavaMethod* aMethod = new JavaMethod(env, aJMethod); // deleted in the JavaClass destructor MethodList* methodList; { JSLock lock(SilenceAssertionsOnly); methodList = m_methods.get(((UString)aMethod->name()).rep()); if (!methodList) { methodList = new MethodList(); m_methods.set(((UString)aMethod->name()).rep(), methodList); } } methodList->append(aMethod); env->DeleteLocalRef(aJMethod); } env->DeleteLocalRef(methods); } env->DeleteLocalRef(aClass); }
JavaClassJobject::JavaClassJobject(jobject anInstance, bool requireAnnotation) : m_requireAnnotation(requireAnnotation) #else JavaClassJobject::JavaClassJobject(jobject anInstance) #endif { 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(); // Get the fields 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); // 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); #if PLATFORM(ANDROID) jmethodID isAnnotationPresentMethodID = getAnnotationMethodID(env); if (!isAnnotationPresentMethodID) { LOG_ERROR("unable to find method %s on instance %p", kIsAnnotationPresent, anInstance); return; } #endif for (int i = 0; i < numMethods; i++) { jobject aJMethod = env->GetObjectArrayElement(static_cast<jobjectArray>(methods), i); #if PLATFORM(ANDROID) if (jsAccessAllowed(env, isAnnotationPresentMethodID, aJMethod)) { #endif JavaMethod* aMethod = new JavaMethodJobject(env, aJMethod); // deleted in the JavaClass destructor MethodList* methodList = m_methods.get(aMethod->name()); if (!methodList) { methodList = new MethodList(); m_methods.set(aMethod->name(), methodList); } methodList->append(aMethod); #if PLATFORM(ANDROID) } #endif env->DeleteLocalRef(aJMethod); } env->DeleteLocalRef(fields); env->DeleteLocalRef(methods); env->DeleteLocalRef(aClass); }
JavaClass::JavaClass(jobject anInstance) { jobject aClass = callJNIMethod<jobject>(anInstance, "getClass", "()Ljava/lang/Class;"); if (!aClass) { fprintf(stderr, "%s: unable to call getClass on instance %p\n", __PRETTY_FUNCTION__, anInstance); return; } jstring className = (jstring)callJNIMethod<jobject>(aClass, "getName", "()Ljava/lang/String;"); const char *classNameC = getCharactersFromJString(className); _name = strdup(classNameC); releaseCharactersForJString(className, classNameC); int i; JNIEnv *env = getJNIEnv(); // Get the fields jarray fields = (jarray)callJNIMethod<jobject>(aClass, "getFields", "()[Ljava/lang/reflect/Field;"); int numFields = env->GetArrayLength(fields); for (i = 0; i < numFields; i++) { jobject aJField = env->GetObjectArrayElement((jobjectArray)fields, i); JavaField *aField = new JavaField(env, aJField); // deleted in the JavaClass destructor { JSLock lock(SilenceAssertionsOnly); _fields.set(aField->name(), aField); } env->DeleteLocalRef(aJField); } // Get the methods jarray methods = (jarray)callJNIMethod<jobject>(aClass, "getMethods", "()[Ljava/lang/reflect/Method;"); int numMethods = env->GetArrayLength(methods); for (i = 0; i < numMethods; i++) { jobject aJMethod = env->GetObjectArrayElement((jobjectArray)methods, i); JavaMethod *aMethod = new JavaMethod(env, aJMethod); // deleted in the JavaClass destructor MethodList* methodList; { JSLock lock(SilenceAssertionsOnly); methodList = _methods.get(aMethod->name()); if (!methodList) { methodList = new MethodList(); _methods.set(aMethod->name(), methodList); } } methodList->append(aMethod); env->DeleteLocalRef(aJMethod); } }