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

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

posted @   江南一点雨  阅读(368)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示