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 参数示意
"<init>" 构造函数
"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, "<init>", "()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");
....
}