美文网首页
对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