Android JNI 笔记 | GetObjectClass、FindClass和GetMethodID

GetObjectClass

jclass GetObjectClass(jobject obj)

obj 参数示意
jobject obj:Java 中传入的 object 类

使用小栗子(其中的 GetMethodID 函数请往下看)

extern "C"
JNIEXPORT jobject JNICALL
Java_....getList(JNIEnv *env, jobject instance, jobject listobj) {
  ....
  // 获取 List 类
  jclass ax_list_jclass = env->GetObjectClass(listobj);
  // 获取 list 的 get方法
  jmethodID listGetMe;
  listGetMe = env->GetMethodID(ax_list_jclass, "get", "(I)Ljava/lang/Object;");
  // 调用 list 的 get 方法获取list中第0个的 java 类。
  jobject findObj = env->CallObjectMethod(listobj, listGetMe , 0);
  ....
}
FindClass(查找java中的类)

jclass FindClass(const char* name)

name 参数示意
const char* name:java中完整报名加类名,例如List类:"java/util/List"

小栗子:

extern "C"
JNIEXPORT jobject JNICALL
Java_....getList(JNIEnv *env, jobject instance) {
  ....
  // 获取 List 类
  jclass list_jclass = env->FindClass("java/util/List");
  ....
}
GetMethodID(查找Java类中的方法)

jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
 参数一:jclass 查找到的java类
 参数二:const char* name 方法名

name 参数示意
"" 构造函数
"add" 名为add的方法,可根据方法名修改

 参数三:const char* sig 方法的返回值

sig参数示意:
boolean:Zbyte:Bchar:Cshort:Sint:I
long:Jfloat:Fdouble:Dvoid:V[数组]:[和类型
Object对象:L包名/类名; 或 包名/类名$标识嵌套类;
例子(方法 ->- 对应的sig):
void M1(int A,int B) ->- "(II)V"
void M2(String S) ->- "(Ljava/lang/String;)V"
void M3(int[] I) ->- "([I)V"
String M4(String S) ->- "(Ljava/lang/String;)Ljava/lang/String"
long M5(int I,Class class) ->- "(ILjava/lang/Class;)J"
void M6(long LONG) ->- "(J)V"

小栗子:

extern "C"
JNIEXPORT jobject JNICALL
Java_....getList(JNIEnv *env, jobject instance) {
  ....
  // 获取 ArrayList 类
  jclass list_jclass = env->FindClass("java/util/ArrayList");
  // 获取 ArrayList 构造函数id
  jmethodID list_init = env->GetMethodID(list_jcs, "", "()V");
  // 创建一个 ArrayList 对象
  jobject list_obj = env->NewObject(list_jcs, list_init, "");
  // 获取 ArrayList 对象的 add() 的 methodID
  jmethodID list_add = env->GetMethodID(list_jcs, "add", "(Ljava/lang/Object;)Z");
  ....
}

你可能感兴趣的:(Android JNI 笔记 | GetObjectClass、FindClass和GetMethodID)