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:Z、byte:B 、char:C、short:S、int:I
long:J、float:F、double:D、void: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");
....
}