1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| //调用java的静态方法 NIEXPORT void JNICALL callJavaStaticMethod (JNIEnv *env, jclass cls) { jclass clazz = NULL; jstring str_arg = NULL; jmethodID mid_static_method; // 1、从classpath路径下搜索ClassMethod这个类,并返回该类的Class对象 clazz =(*env)->FindClass(env,"com/study/jnilearn/ClassMethod"); if (clazz == NULL) { return; }
// 2、从clazz类中查找callStaticMethod方法 mid_static_method = (*env)->GetStaticMethodID(env,clazz,"callStaticMethod","(Ljava/lang/String;I)V"); if (mid_static_method == NULL) { printf("找不到callStaticMethod这个静态方法。"); return; }
// 3、调用clazz类的callStaticMethod静态方法 str_arg = (*env)->NewStringUTF(env,"我是静态方法"); //调用Java的静态方法不需要Java类的对象。后面需要传入参数。 (*env)->CallStaticVoidMethod(env,clazz,mid_static_method, str_arg, 100); // 删除局部引用 (*env)->DeleteLocalRef(env,clazz); (*env)->DeleteLocalRef(env,str_arg); }
/* * 调用java的实例方法 */ JNIEXPORT void JNICALL callJavaInstaceMethod (JNIEnv *env, jclass cls) { jclass clazz = NULL; jobject jobj = NULL; jmethodID mid_construct = NULL; jmethodID mid_instance = NULL; jstring str_arg = NULL; // 1、从classpath路径下搜索ClassMethod这个类,并返回该类的Class对象 clazz = (*env)->FindClass(env, "com/study/jnilearn/ClassMethod"); if (clazz == NULL) { printf("找不到'com.study.jnilearn.ClassMethod'这个类"); return; }
// 2、获取类的默认构造方法ID ,没有参数 mid_construct = (*env)->GetMethodID(env,clazz, "<init>","()V"); if (mid_construct == NULL) { printf("找不到默认的构造方法"); return; }
// 3、查找实例方法的ID ,第三个参数传入java方法的名称。第四个是方法参数表达式 mid_instance = (*env)->GetMethodID(env, clazz, "callInstanceMethod", "(Ljava/lang/String;I)V"); if (mid_instance == NULL) { return; }
// 4、创建该类的实例 jobj = (*env)->NewObject(env,clazz,mid_construct); if (jobj == NULL) { printf("在com.study.jnilearn.ClassMethod类中找不到callInstanceMethod方法"); return; }
// 5、调用对象的实例方法 str_arg = (*env)->NewStringUTF(env,"我是实例方法"); //创建字符串的方法 (*env)->CallVoidMethod(env,jobj,mid_instance,str_arg,200); //调用方法,需要传入参数
// 删除局部引用 (*env)->DeleteLocalRef(env,clazz); (*env)->DeleteLocalRef(env,jobj); (*env)->DeleteLocalRef(env,str_arg);
|