码迷,mamicode.com
首页 > 其他好文 > 详细

NDK开发之调用方法

时间:2015-09-05 15:08:23      阅读:180      评论:0      收藏:0      [点我收藏+]

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

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

NDK开发之调用方法

标签:android   ndk   

原文地址:http://blog.csdn.net/u012702547/article/details/48224633

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!