NDK开发之调用方法

举报
江南一点雨 发表于 2021/08/16 23:51:46 2021/08/16
【摘要】 与NDK开发之访问域中介绍的一样,Java中的方法也是分为两类:实例方法和静态方法。JNI提供了访问两类方法的函数,下面我们一起来看看怎么在C中访问Java中的方法。 我们的MainActivity中有两个方法,分别是: private String instanceMethod(){ return "Instance Method"; } private sta...

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

 private String instanceMethod(){ return "Instance Method"; } private static String staticMethod(){ return "static Method"; }
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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


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


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

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

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;");
  
 
  • 1
  • 2
  • 3
  • 4

3.通过方法ID调用方法

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

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

 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);
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

完整代码是这样的:

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);
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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

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

文章来源: wangsong.blog.csdn.net,作者:_江南一点雨,版权归原作者所有,如需转载,请联系作者。

原文链接:wangsong.blog.csdn.net/article/details/48224633

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。