美文网首页
对Method、Field的访问

对Method、Field的访问

作者: 禅座 | 来源:发表于2019-06-14 13:49 被阅读0次

    访问非静态方法

    //访问非静态方法(JNI)
    JNIEXPORT void JNICALL Java_com_zzqqiang_Jni_1Test_accessMethod
    (JNIEnv * env, jobject jobj) {
        //jclass
        jclass jclz = (*env)->GetObjectClass(env, jobj);
        //jmethodId
        //方法的名字,方法的签名
        jmethodID mid = (*env)->GetMethodID(env, jclz, "getRandomInt", "(I)I");
        //调用
        jint random = (*env)->CallIntMethod(env, jobj, mid, 200);
        printf("C random: %d \n", random);
    }
    public class JniMain {
        public native void accessMethod();
        //java
        public int getRandomInt(int value);
    }
    

    访问静态方法

    //JNI 访问Java 中的静态方法(JNI)
    JNIEXPORT void JNICALL Java_com_zzqqiang_1Test_accessStaticMethod
    (JNIEnv *env, jobject jobj) {
        //jclass, 通过jobjcct 来搜索class,如果找到了,将这个class 转变成jclass,然后返回。
        jclass clz = (*env)->GetObjectClass(env, jobj);
        //jmethdId,GETStaticMethodID  方法的名字,方法的签名
        jmethodID jmid = (*env)->GetStaticMethodID(env, clz, "getRandeomUUId", "()Ljava/lang/String;");
        // 调用静态方法
        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");
    }
    
    
    //java
    public class JniMain {
        public native void accessStaticMethod();
        public static String getUUID() {
            return UUID.randomUUID().toString();
        }   
    }
    

    访问Java的构造方法

    //访问java构造方法
    JNIEXPORT jobject JNICALL Java_com_zzqqiang_1Test_acceessConstructor
    (JNIEnv * env, jobject jobj) {
        //通过类的路径来从JVM中找到对应的类
        jclass jclz = (*env)->FindClass(env,"java/util/Date");
        //获取构造函数的methodID 所有构造函数传入的函数名都为“<init>”
        jmethodID jmid =(*env)->GetMethodID(env,jclz,"<init>","()V");
        //调用newobject 实例化Date对象,返回值是一个object
        jobject date_obj = (*env)->NewObject(env,jclz,jmid);
        //得到对应对象的方法,前提是,我们访问了相关对象的构造函数创建了这个对象
        jmethodID time_mid = (*env)->GetMethodID(env,jclz,"getTime","()J");
        jlong time = (*env)->CallLongMethod(env,date_obj_time_mid);
        printf("time:%lld",time)
        return date_obj;
    }
    //java
    public class JniMain {
        public native Date accessConstructor();
    }
    

    访问基本类型数据数组

    JNIEXPORT void JNICALL Java_com_zzqqiang_1Test_giveArray
    (JNIEnv * env, jobject jobj, jintArray arr) {
        //局部声明
        int compare(jint * a, jint *b);
        //jintArray -> jint *
        jint *elemts = (*env)->GetIntArrayElements(env, arr, NULL);
        if (elemts == NULL)
        {
            return;
        }
        //数组长度
        int len = (*env)->GetArrayLength(env, arr);
        qsort(elemts, len, sizeof(jint), compare);
        //释放可能的内存
        //将JNI  修改的数据重新写回原来的内存
        (*env)->ReleaseIntArrayElements(env, arr, elemts, JNI_COMMIT);
    }
    
    
    //比较函数
    int compare(jint * a, jint *b) {
        return *a - *b;
    }
    
    
    //java
    public class JniMain {
        public native void giveArray(int[] inArray);
    }
    

    访问引用数据类型数组

    JNIEXPORT jobjectArray JNICALL Java_com_zzqqiang_1Test_initStringArray
    (JNIEnv * env, jobject jobj, jint size) {
        //创建jobjectArray
        jobjectArray result;
        jclass jclz;
        int i;
        jclz = (*env)->FindClass(env,"java/lang/String");
        if (jclz==null) {
            return NULL;
        }
        result = (*env)->NewObjectArray(env,size,jclz,jobj);
        if (result == NULL) {
            return NULL;
        }
        //赋值
        for(int I=0;i<size;i++) {
            //C 字符串
            char * c_str = (char *)malloc(256);
            memset(c_str,0,256);
            //将int 转换成为char
            sprintf(c_str, "hello num: %d\n", i);
            //C ->jstring
            jstring str = (*env)->NewStringUTF(env, c_str);
            if (str == NULL) {
                return NULL;
            }
            //将jstring 赋值给数组
            (*env)->SetObjectArrayElement(env, result, i, str);
            free(c_str);
            c_str = NULL; 
            }
            return result;
        }
    //java
    public class JniMain {
        public native String[] initStringArray(int size);
    }
    

    相关文章

      网友评论

          本文标题:对Method、Field的访问

          本文链接:https://www.haomeiwen.com/subject/yqzlxctx.html