NDK开发之调用方法

NDK开发之访问域中介绍的一样,Java中的方法也是分为两类:实例方法和静态方法。JNI提供了访问两类方法的函数,下面我们一起来看看怎么在C中访问Java中的方法。
我们的MainActivity中有两个方法,分别是:

    private String instanceMethod(){
        return "Instance Method";
    }
    private static String staticMethod(){
        return "static Method";
    }

那么我们该怎么在C中访问这两个方法呢?
步骤和访问域是一样的:


1.通过对象引用获得类
2.通过类获得方法ID
3.通过方法ID调用方法


下面按步骤来
1.通过对象引用获得类

clazz = (*env)->GetObjectClass(env, thiz);

2.通过类获得方法ID
JNI提供了用方法ID访问两类方法的途径,可以用给定实例的class对象获得方法ID,用GetMethodID函数获得实例方法的方法ID。与字段ID获取方法一样,两个函数的最后一个参数均表示方法描述符,在Java中它们表示方法签名。(为了提高应用性能,我们可以缓存方法ID)

instanceMethodID = (*env)->GetMethodID(env, clazz, "instanceMethod",
            "()Ljava/lang/String;");
    staticMethodID = (*env)->GetStaticMethodID(env, clazz, "staticMethod",
            "()Ljava/lang/String;");

3.通过方法ID调用方法

instanceMethodResult = (*env)->CallObjectMethod(env,thiz,instanceMethodID);
    staticMethodResult = (*env)->CallStaticObjectMethod(env,clazz,staticMethodID);

为了查看是否调用成功,我们需要把调用结果打印出来:

    const jbyte* str1;
    const jbyte* str2;
    str1 = (*env)->GetStringUTFChars(env, instanceMethodResult, 0);
    str2 = (*env)->GetStringUTFChars(env, staticMethodResult, 0);
    LOGI("the string is :%s", str1);
    LOGI("the string is :%s", str2);

完整代码是这样的:

void Java_com_example_jni_MainActivity_getMethod(JNIEnv* env, jobject thiz) {
    jclass clazz;
    jmethodID instanceMethodID;
    jmethodID staticMethodID;
    jstring instanceMethodResult;
    jstring staticMethodResult;
    clazz = (*env)->GetObjectClass(env, thiz);
//  clazz = (*env)->FindClass(env,"com/example/jni/JavaClass");
    instanceMethodID = (*env)->GetMethodID(env, clazz, "instanceMethod",
            "()Ljava/lang/String;");
    staticMethodID = (*env)->GetStaticMethodID(env, clazz, "staticMethod",
            "()Ljava/lang/String;");
    instanceMethodResult = (*env)->CallObjectMethod(env,thiz,instanceMethodID);
    staticMethodResult = (*env)->CallStaticObjectMethod(env,clazz,staticMethodID);
    //jstring转为C字符串然后打印出来
    const jbyte* str1;
    const jbyte* str2;
    str1 = (*env)->GetStringUTFChars(env, instanceMethodResult, 0);
    str2 = (*env)->GetStringUTFChars(env, staticMethodResult, 0);
    LOGI("the string is :%s", str1);
    LOGI("the string is :%s", str2);
}

打印结果:
这里写图片描述

Java和C之间的转换时代价较大的操作,在实际开发中我们应该尽量避免这种情况的出现。

原文地址:https://www.cnblogs.com/qitian1/p/6461750.html