1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-03 17:59:33 +02:00

avoided jmethodID usages

This commit is contained in:
Nikolay Pultsin 2012-03-31 11:44:59 +01:00
parent f68bd00b36
commit 062df7442a
5 changed files with 53 additions and 8 deletions

View file

@ -25,6 +25,8 @@
JavaVM *AndroidUtil::ourJavaVM = 0;
shared_ptr<JavaClass> AndroidUtil::Class_java_lang_Object;
shared_ptr<JavaArray> AndroidUtil::Array_java_lang_Object;
shared_ptr<JavaClass> AndroidUtil::Class_java_lang_RuntimeException;
shared_ptr<JavaClass> AndroidUtil::Class_java_lang_String;
shared_ptr<JavaClass> AndroidUtil::Class_java_util_Collection;
@ -49,7 +51,7 @@ shared_ptr<JavaClass> AndroidUtil::Class_NativeBookModel;
shared_ptr<StringMethod> AndroidUtil::Method_java_lang_String_toLowerCase;
shared_ptr<StringMethod> AndroidUtil::Method_java_lang_String_toUpperCase;
jmethodID AndroidUtil::MID_java_util_Collection_toArray;
shared_ptr<ObjectArrayMethod> AndroidUtil::Method_java_util_Collection_toArray;
shared_ptr<StaticObjectMethod> AndroidUtil::StaticMethod_java_util_Locale_getDefault;
shared_ptr<StringMethod> AndroidUtil::Method_java_util_Locale_getLanguage;
@ -126,6 +128,8 @@ bool AndroidUtil::init(JavaVM* jvm) {
JNIEnv *env = getEnv();
Class_java_lang_Object = new JavaClass(env, "java/lang/Object");
Array_java_lang_Object = new JavaArray(*Class_java_lang_Object);
Class_java_lang_RuntimeException = new JavaClass(env, "java/lang/RuntimeException");
Class_java_lang_String = new JavaClass(env, "java/lang/String");
Class_java_util_Collection = new JavaClass(env, "java/util/Collection");
@ -152,7 +156,7 @@ bool AndroidUtil::init(JavaVM* jvm) {
Method_java_lang_String_toLowerCase = new StringMethod(*Class_java_lang_String, "toLowerCase", "()");
Method_java_lang_String_toUpperCase = new StringMethod(*Class_java_lang_String, "toUpperCase", "()");
CHECK_NULL( MID_java_util_Collection_toArray = env->GetMethodID(Class_java_util_Collection->j(), "toArray", "()[Ljava/lang/Object;") );
Method_java_util_Collection_toArray = new ObjectArrayMethod(*Class_java_util_Collection, "toArray", *Array_java_lang_Object, "()");
StaticMethod_java_util_Locale_getDefault = new StaticObjectMethod(*Class_java_util_Locale, "getDefault", *Class_java_util_Locale, "()");
Method_java_util_Locale_getLanguage = new StringMethod(*Class_java_util_Locale, "getLanguage", "()");

View file

@ -28,6 +28,7 @@
#include <shared_ptr.h>
class JavaClass;
class JavaArray;
class Constructor;
class ObjectField;
class VoidMethod;
@ -36,6 +37,7 @@ class LongMethod;
class BooleanMethod;
class StringMethod;
class ObjectMethod;
class ObjectArrayMethod;
class StaticObjectMethod;
class ZLFile;
@ -47,6 +49,8 @@ private:
static JavaVM *ourJavaVM;
public:
static shared_ptr<JavaClass> Class_java_lang_Object;
static shared_ptr<JavaArray> Array_java_lang_Object;
static shared_ptr<JavaClass> Class_java_lang_RuntimeException;
static shared_ptr<JavaClass> Class_java_lang_String;
static shared_ptr<JavaClass> Class_java_util_Collection;
@ -71,7 +75,7 @@ public:
static shared_ptr<StringMethod> Method_java_lang_String_toLowerCase;
static shared_ptr<StringMethod> Method_java_lang_String_toUpperCase;
static jmethodID MID_java_util_Collection_toArray;
static shared_ptr<ObjectArrayMethod> Method_java_util_Collection_toArray;
static shared_ptr<StaticObjectMethod> StaticMethod_java_util_Locale_getDefault;
static shared_ptr<StringMethod> Method_java_util_Locale_getLanguage;

View file

@ -34,6 +34,13 @@ JavaType::JavaType() {
JavaType::~JavaType() {
}
JavaArray::JavaArray(const JavaType &base) : myBase(base) {
}
std::string JavaArray::code() const {
return "[" + myBase.code();
}
JavaClass::JavaClass(JNIEnv *env, const std::string &name) : myName(name), myEnv(env) {
myClass = 0;
}
@ -175,7 +182,7 @@ jstring StringMethod::call(jobject base, ...) {
return result;
}
ObjectMethod::ObjectMethod(const JavaClass &cls, const std::string &name, const JavaType &returnType, const std::string &parameters) : Method(cls, name, returnType, parameters) {
ObjectMethod::ObjectMethod(const JavaClass &cls, const std::string &name, const JavaClass &returnType, const std::string &parameters) : Method(cls, name, returnType, parameters) {
}
jobject ObjectMethod::call(jobject base, ...) {
@ -188,7 +195,20 @@ jobject ObjectMethod::call(jobject base, ...) {
return result;
}
StaticObjectMethod::StaticObjectMethod(const JavaClass &cls, const std::string &name, const JavaType &returnType, const std::string &parameters) : StaticMethod(cls, name, returnType, parameters) {
ObjectArrayMethod::ObjectArrayMethod(const JavaClass &cls, const std::string &name, const JavaArray &returnType, const std::string &parameters) : Method(cls, name, returnType, parameters) {
}
jobjectArray ObjectArrayMethod::call(jobject base, ...) {
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling ObjectArrayMethod " + myName);
va_list lst;
va_start(lst, base);
jobjectArray result = (jobjectArray)env().CallObjectMethodV(base, myId, lst);
va_end(lst);
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished ObjectArrayMethod " + myName);
return result;
}
StaticObjectMethod::StaticObjectMethod(const JavaClass &cls, const std::string &name, const JavaClass &returnType, const std::string &parameters) : StaticMethod(cls, name, returnType, parameters) {
}
jobject StaticObjectMethod::call(...) {

View file

@ -57,6 +57,16 @@ private:
const std::string myCode;
};
class JavaArray : public JavaType {
public:
JavaArray(const JavaType &base);
std::string code() const;
private:
const JavaType &myBase;
};
class JavaClass : public JavaType {
public:
@ -179,14 +189,21 @@ public:
class ObjectMethod : public Method {
public:
ObjectMethod(const JavaClass &cls, const std::string &name, const JavaType &returnType, const std::string &parameters);
ObjectMethod(const JavaClass &cls, const std::string &name, const JavaClass &returnType, const std::string &parameters);
jobject call(jobject base, ...);
};
class ObjectArrayMethod : public Method {
public:
ObjectArrayMethod(const JavaClass &cls, const std::string &name, const JavaArray &returnType, const std::string &parameters);
jobjectArray call(jobject base, ...);
};
class StaticObjectMethod : public StaticMethod {
public:
StaticObjectMethod(const JavaClass &cls, const std::string &name, const JavaType &returnType, const std::string &parameters);
StaticObjectMethod(const JavaClass &cls, const std::string &name, const JavaClass &returnType, const std::string &parameters);
jobject call(...);
};

View file

@ -52,7 +52,7 @@ jobjectArray JavaFSDir::getFileChildren(JNIEnv *env) {
if (list == 0) {
return 0;
}
jobjectArray array = (jobjectArray)env->CallObjectMethod(list, AndroidUtil::MID_java_util_Collection_toArray);
jobjectArray array = AndroidUtil::Method_java_util_Collection_toArray->call(list);
env->DeleteLocalRef(list);
return array;
}