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");
}
复制代码

 

posted @   Plus301  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示