汝阳网站开发,建设银行手机网站首页,软件开发赚钱多吗,网站销售源码一、Jni调用Java代码 jni可以调用java中的方法和java中的成员变量,因此JNIEnv定义了一系列的方法来帮助我们调用java的方法和成员变量。 以上就是jni调用java类的大部分方法,如果是静态的成员变量和静态方法,可以使用***GetStaticMethodID、CallStaticObjectMethod等***。就…一、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类的方法返回什么类型,就用相应类型的CallTypeMethod方法。CallTypeMethod表示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)); //--------------通过有参构造#