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

  • 相关阅读:
    SQL Sever语言 存储过程及触发器
    计蒜客 挑战难题 移除数组中的重复元素
    projecteuler Sum square difference
    码农谷 求前N项之和
    projecteuler Smallest multiple
    计蒜客 挑战难题 寻找插入位置
    Largest palindrome product
    计蒜客 挑战难题 元素移除
    码农谷 球从M米高度自由下落第N次落地时反弹的高度
    挑战难题 奇怪的国家
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461750.html
Copyright © 2011-2022 走看看