访问Java的非静态属性

JNIEXPORT void JNICALL
Java_com_win_ndksample_AccessField_accessInstanceField(
        JNIEnv *env, jclass type, jobject classField, jstring s_) {
    const char *s = (*env)->GetStringUTFChars(env, s_, 0);

    //通过对象拿到class
    jclass clz = (*env)->GetObjectClass(env, classField);
    //拿到对应属性ID
    jfieldID fid = (*env)->GetFieldID(env, clz, "str", "Ljava/lang/String;");
    //通过属性ID拿到属性的值
    jstring jstr = (*env)->GetObjectField(env, classField, fid);

    //将JAVA字符串转为c字符串
    const char *cstr = (*env)->GetStringUTFChars(env, jstr, NULL);
    //将传入的s叠加到属性变量后面
    char buff[50];
    sprintf(buff, "%s%s", cstr, s);

    //将C字符串转为JAVA字符串
    jstring jst_new = (*env)->NewStringUTF(env, buff);
    (*env)->SetObjectField(env, classField, fid, jst_new);

    (*env)->ReleaseStringUTFChars(env, jstr, cstr);
    (*env)->ReleaseStringUTFChars(env, s_, s);
}

访问Java的静态属性

JNIEXPORT void JNICALL
Java_com_win_ndksample_AccessField_accessStaticField__I(JNIEnv *env, jclass type, jint num) {
    //通过完整类名拿到class
    jclass clz = (*env)->FindClass(env, "com/win/ndksample/ClassField");
    //拿到对应静态属性ID
    jfieldID fid = (*env)->GetStaticFieldID(env, clz, "num", "I");
    //通过静态属性ID拿到静态属性的值
    jint jnum = (*env)->GetStaticIntField(env, clz, fid);
    printf("Java num is %d", jnum);
    //通过静态属性ID修改静态属性的值
    (*env)->SetStaticIntField(env, clz, fid, num);
}

访问JAVA的非静态方法


JNIEXPORT void JNICALL
Java_com_win_ndksample_AccessMethod_accessInstanceMethod(JNIEnv *env, jclass type,
                                                        jobject classField) {
    //通过对象实例找到class
    jclass clz = (*env)->GetObjectClass(env, classField);
    //通过class得到methodID
    jmethodID mID = (*env)->GetMethodID(env, clz, "instanceMethod", "()V");
    //通过mID调用Void方法
    (*env)->CallVoidMethod(env, classField, mID);

}

访问JAVA的静态方法

JNIEXPORT void JNICALL
Java_com_win_ndksample_AccessMethod_accessStaticMethod(JNIEnv *env, jclass type) {

    //通过完整类名找到class
    jclass clz = (*env)->FindClass(env, "com/win/ndksample/ClassField");
    //通过class得到静态方法Id
    jmethodID mID = (*env)->GetStaticMethodID(env, clz, "staticMethod", "()V");
    //通过mID调用Void方法
    (*env)->CallStaticVoidMethod(env, clz, mID);
}

访问JAVA父类方法

JNIEXPORT void JNICALL
Java_com_win_ndksample_AccessMethod_accessSuperMethod(JNIEnv *env, jclass type,
                                                      jobject classField) {
    //通过完整类名找到class
    jclass super_clz = (*env)->FindClass(env, "com/win/ndksample/SuperClass");
    //通过class找到方法id
    jmethodID mid = (*env)->GetMethodID(env, super_clz, "instanceMethod", "()V");

    //调用对象实例的方法实现
    (*env)->CallVoidMethod(env, classField, mid);
    //调用父类的方法实现
    (*env)->CallNonvirtualVoidMethod(env, classField, super_clz, mid);
}

使用CallVoidMethod,虽然传进去的是父类的Method ID,但是访问的让然是子类的实现。

通过CallNonvirtualVoidMethod,访问不覆盖的父类方法(C++使用virtual关键字来覆盖父类的实现),当然你也可以指定哪个父类(如果有多个父类的话)

访问JAVA类构造方法

JNIEXPORT jstring JNICALL
Java_com_win_ndksample_AccessMethod_accessConstructor(JNIEnv *env, jclass type) {
    //通过完整类名找到Date类
    jclass clz_date = (*env)->FindClass(env, "java/util/Date");
    //通过clz找到Date类构造方法
    jmethodID mid_date = (*env)->GetMethodID(env, clz_date, "<init>", "()V");

    //通过构造方法进行实例化对象
    jobject date = (*env)->NewObject(env, clz_date, mid_date);

    //通过clz找到Date的getTime方法
    jmethodID mid_getTime = (*env)->GetMethodID(env, clz_date, "toString", "()Ljava/lang/String;");
    //调用getTime方法
    jstring jtime = (*env)->CallObjectMethod(env, date, mid_getTime);

    return jtime;
}

results matching ""

    No results matching ""