JNI调用Java层方法
一、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"); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix