PLC
登录
直播中
李红
7年用户
1296经验值
私信
关注
C/C++中调用Java不同类中的静态方法有哪些
开启该帖子的消息推送
Android
代码
C/C++中调用Java不同类中的静态方法有哪些?
C/C++调用java的方法是什么?
回帖
(1)
孙喆
2021-9-30 16:37:31
前言
上一篇我们介绍了《Android NDK编程(四)--- C/C++调用Java中的方法》,主要是C/C++中调用Java的方法,这一篇我们针对上一篇的内容再延伸说一下,关于调不同类中的静态方法。
代码演示
我们继续接着原来的Demo程序进行处理,首先我们先新建一个类名为VaccaeJNI,然后在这个类里面增加一个native的静态方法。
通过ALT+ENTER在native-lib.cpp中增加了对应的方法函数,然后写实现方法。
最后再我们的按钮事件里调用VaccaeJNI类中的静态方法
运行结果
上面来说我们从java调C/C++的方法其实基本都差不多,下面我们重点要说一下C/C++调用java的方法。
我们在VaccaeJNI中加入一个native的静态方法和一个本地的静态方法。
然后再对应的C++文件中写入实现方法
从上图我们可以看到,调用静态方法的时候我们的GetMethodID和CallMethod方法都加上了static变为GetStaticMethodID和CallStaticIntMethod,如果这里不改变的话,调用时就会报错了。
在按钮事件中我们再写实现方法
相对来说调用静态方法还是比较简单的,我们看一下运行结果
调用不同类中的方法
最后我们要说一下重点,因为我们在写方法的时候可能会调用的是不同类里面的方法,导航native的方法和要调用的java方法不在同一个类里,遇到这样的方法我们来看一看怎么实现。
我们还是在VaccaeJNI的类中写一个非静态的方法,两个数相乘
然后调用的native的函数,我们直接写在Mainactivity.java中
上图中我们先定义了一个plusFromJNI的参数,输入两个值得到返回数,然后先把按钮事件写了调用方法,接下来我们按ALT+ENTER在C++的文件中生成方法
native-lib.cpp
extern “C”JNIEXPORT jint JNICALLJava_dem_vac_vaccaendk_MainActivity_plusFromJNI(JNIEnv *env, jobject instance, jint a, jint b) { //首先获取class,这里传入的参数jobject是代表了Mainactivity,所以我们要自己查找 jclass jcls=env-》FindClass(“dem/vac/vaccaendk/VaccaeJNI”); if (jcls == NULL) { return 0; } //获取方法 jmethodID jmethod = env-》GetMethodID(jcls, “Plus”, “(II)I”); if(jmethod==NULL) { return 0; } //调用访法 //第一个参数为jobject的这是传入的是jobject是Mainactivity, //如果在CallIntMethod里面直接用传入的肯定会出错,因为我们的 //方法是在VaccaeJNI的类里面,所以我们首先要实例化那个类,再调用 jobject jobj = env-》AllocObject(jcls); return env-》CallIntMethod(jobj,jmethod,a,b);} 上面代码中我们主要要关注几个我写了注释的地方,如下图
最后我们再运行一下程序,看看结果
-
前言
上一篇我们介绍了《Android NDK编程(四)--- C/C++调用Java中的方法》,主要是C/C++中调用Java的方法,这一篇我们针对上一篇的内容再延伸说一下,关于调不同类中的静态方法。
代码演示
我们继续接着原来的Demo程序进行处理,首先我们先新建一个类名为VaccaeJNI,然后在这个类里面增加一个native的静态方法。
通过ALT+ENTER在native-lib.cpp中增加了对应的方法函数,然后写实现方法。
最后再我们的按钮事件里调用VaccaeJNI类中的静态方法
运行结果
上面来说我们从java调C/C++的方法其实基本都差不多,下面我们重点要说一下C/C++调用java的方法。
我们在VaccaeJNI中加入一个native的静态方法和一个本地的静态方法。
然后再对应的C++文件中写入实现方法
从上图我们可以看到,调用静态方法的时候我们的GetMethodID和CallMethod方法都加上了static变为GetStaticMethodID和CallStaticIntMethod,如果这里不改变的话,调用时就会报错了。
在按钮事件中我们再写实现方法
相对来说调用静态方法还是比较简单的,我们看一下运行结果
调用不同类中的方法
最后我们要说一下重点,因为我们在写方法的时候可能会调用的是不同类里面的方法,导航native的方法和要调用的java方法不在同一个类里,遇到这样的方法我们来看一看怎么实现。
我们还是在VaccaeJNI的类中写一个非静态的方法,两个数相乘
然后调用的native的函数,我们直接写在Mainactivity.java中
上图中我们先定义了一个plusFromJNI的参数,输入两个值得到返回数,然后先把按钮事件写了调用方法,接下来我们按ALT+ENTER在C++的文件中生成方法
native-lib.cpp
extern “C”JNIEXPORT jint JNICALLJava_dem_vac_vaccaendk_MainActivity_plusFromJNI(JNIEnv *env, jobject instance, jint a, jint b) { //首先获取class,这里传入的参数jobject是代表了Mainactivity,所以我们要自己查找 jclass jcls=env-》FindClass(“dem/vac/vaccaendk/VaccaeJNI”); if (jcls == NULL) { return 0; } //获取方法 jmethodID jmethod = env-》GetMethodID(jcls, “Plus”, “(II)I”); if(jmethod==NULL) { return 0; } //调用访法 //第一个参数为jobject的这是传入的是jobject是Mainactivity, //如果在CallIntMethod里面直接用传入的肯定会出错,因为我们的 //方法是在VaccaeJNI的类里面,所以我们首先要实例化那个类,再调用 jobject jobj = env-》AllocObject(jcls); return env-》CallIntMethod(jobj,jmethod,a,b);} 上面代码中我们主要要关注几个我写了注释的地方,如下图
最后我们再运行一下程序,看看结果
-
举报
更多回帖
rotate(-90deg);
回复
相关问答
Android
代码
学习
c++
和
Java
2014-03-01
4777
在NDK开发
中
C++
的代码
中
怎么实现日志输出
2021-09-30
1303
如何在
C++
中
包含
C
代码?
2023-01-11
279
C++
中
的四种类型转换分别是哪些?
C++
中
析构函数的作用是什么
2021-12-24
1156
使用
C++
项目的正确
方法
是什么?
2023-02-07
288
没有
调用
静态
对象的
C
++构造函数
2018-09-18
1663
请问我能在
C++
中
编写任何代码吗?
2019-06-11
922
LabVIEW如何
调用
Java
程序的问题
2013-10-19
16630
C
/
C++
与汇编语言是如何交互的
2021-02-01
1079
如何使用内联函数法
调用
汇编函数?
2021-04-02
1803
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分