• 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之间的转换时代价较大的操作,在实际开发中我们应该尽量避免这种情况的出现。

    版权声明:本文为博主原创文章,未经博主允许不得转载。若有错误地方,还望批评指正,不胜感激。

  • 相关阅读:
    [恢]hdu 2098
    [恢]hdu 2049
    [恢]hdu 2027
    [恢]hdu 2111
    [恢]hdu 1202
    [恢]hdu 2131
    Windows Phone 7 文件下载进度和速度显示
    深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例
    深入WPF中的图像画刷(ImageBrush)之2——ImageBrush的铺设方式
    textblock设置属性
  • 原文地址:https://www.cnblogs.com/lenve/p/4889323.html
Copyright © 2020-2023  润新知