一、JNI 访问Java中的构造方法
JNIEXPORT jobject JNICALL Java_JniMain_accessConstructor(JNIEnv * env, jobject jobj)
{
//1.通过类的路径来从JVM里面找到对应的类
jclass jclz = (*env)->FindClass(env,"java/util/Date");
//获取构造方法的jmothodID
//<init> : 构造方法的名字,所有的构造方法的名字都是他
//()V : 签名 自己用javap命令获取
jmethodID jmid = (*env)->GetMethodID(env, jclz, "<init>", "()V");
//3.调用newObject实例化一个Date对象,返回值是一个jobject
//jni中所有引用的数据类型都会转化成jobject
jobject date_obj = (*env)->NewObject(env, jclz, jmid);
//4.获取Date类中的getTime方法的jmethidID
//前提是,我们访问了相关对象的构造函数创建了这个对象
jmethidID time_mid = (*env)->GetMethodID(env, jclz, "getTime", "()J");
//5.执行getTime方法
jlong time =(*env)->CallLongMethod(env, date_obj, time_mid);
printf("time: %lld \n", time);
return date_obj;
}
二、JNI 访问Java中的普通方法
public class JniMain {
public native void accessMethod();
public int getRandomInt(int max)
{
return new Random().nextInt(max);
}
}
JNIEXPORT void JNICALL Java_JniMain_accessMethod(JNIEnv *env, jobject jobj)
{
//1.得到jclass
jclass jclz = (*env)->GetObjectClass(env, jobj);
//2.获取jmethidId
//getRandomInt:java方法的名字
//(I)I:方法的签名
jmethodID mid = (*env)->GetMethodID(env, jclz, "getRandomInt", "(I)I");
//3.调用java getRandomInt()方法 200:getRandomInt的参数
jint random = (*env)->CallIntMethod(env, jobj, mid, 200);
printf("C ramdom:%d\n", random);
}
三、JNI 访问Java中的静态方法
public class JniMain {
public native void accessStaticMethod();
public static String getRandomUUId() {
return UUID.randomUUID.toString();
}
}
JNIEXPORT void JNICALL Java_JniMain_accessStaticMethod
(JNIEnv *env, jobject jobj)
{
//1.找到jclass
//原理:通过jobject来搜索class,如果找到了,将这个class 转变成jclass,然后返回
jclass clz = (*env)->GetObjectClass(env, jobj);
//2.找到jmethdId
//getRandeomUUId:java方法名字
//()Ljava/lang/String :签名
jmethodID jmid = (*env)->GetStaticMethodID(env, clz, "getRandomUUId", "()Ljava/lang/String;");
//3.调用静态方法,得到java提供的uuid
jstring uuid = (*env)->CallStaticObjectMethod(env, clz, jmid);
//jstring转化成char*
char * uuid_c = (*env)->GetStringUTFChars(env, uuid, NULL);
//生成一个uuid.txt的文本文件到本地
char filename[100];
sprintf(filename, "D://%s.txt", uuid_c);
FILE *fp = fopen(filename, "w";);//写入流
fputs("I Love AV", fp);
fclose(fp);
printf("文件写入成功\n");
}