一、Jni调用Java代码
jni可以调用java中的方法和java中的成员变量,因此JNIEnv定义了一系列的方法来帮助我们调用java的方法和成员变量。
以上就是jni调用java类的大部分方法,如果是静态的成员变量和静态方法,可以使用***GetStaticMethodID、CallStaticObjectMethod等***。就是在上述表格中的相应方法中加个static。
上述中有一个重要的点就是:构造方法的方法id获取,GetMethodID第二个参数传***"< init >"***,这个是固定写法,不能变
上述中还有一个重要的点就是:方法签名(GetFieldID,GetMethodID中的需要的sig参数),这玩意需要记住的,如果记不住,可以通过 javap -s -p 命令去获取,关于javap命令不多说了,下面给一个实例命令行:
javap -s -p E:\1_Study_Space\6_JNI\2_JNI\app\build\intermediates\classes\debug\tsw\demo\a2_jni\Student.class
下面是jni调用java类方法的实例代码
//jni调用java方法
public native void jniCallJava();
public class Student {
public String name;
public String sex;
public Student() {
}
public Student(String name, String sex) {
this.name = name;
this.sex = sex;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
extern "C"
JNIEXPORT void JNICALL
Java_tsw_demo_a2_1jni_TestJni_jniCallJava(JNIEnv *env, jobject instance) {
//------------------通过无参构造获取Student类的对象,同时调用setName方法给对象赋值------------------
jobject jobj_student;
jmethodID jmid_tostring;
//1、获取java类Student的jclass
jclass jcla_student = env->FindClass("tsw/demo/a2_jni/Student");
//2、获取Student的无参构造方法id。构造方法第二个参数,固定传 <init>,不能变;第三个参数是方法签名
jmethodID jmid_student = env->GetMethodID(jcla_student, "<init>", "()V");
//3、获取student对象
jobj_student = env->NewObject(jcla_student, jmid_student);
//4、获取Student类setName方法id。第二个参数是方法名;第三个参数是方法签名
jmethodID jmid_setname = env->GetMethodID(jcla_student, "setName", "(Ljava/lang/String;)V");
//5、调用Student类setName方法。因为Student的setName是void类型,所以用CallVoidMethod。
//java类的方法返回什么类型,就用相应类型的Call<Type>Method方法。Call<Type>Method表示CallVoidMethod、CallLongMethod、CallObjectMethod等。
env->CallVoidMethod(jobj_student, jmid_setname, env->NewStringUTF("zhangsan"));
//6、调用Student的toString方法
jmid_tostring = env->GetMethodID(jcla_student, "toString", "()Ljava/lang/String;");
jstring j_tostring = (jstring) env->CallObjectMethod(jobj_student, jmid_tostring);
LOGE("setName方法给对象赋值: %s", env->GetStringUTFChars(j_tostring, JNI_FALSE));
//--------------通过有参构造&#