Android NDK编程(五)--- C/C++调用Java不同类中的静态方法

前言

上一篇我们介绍了《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变为GetStaticMethodIDCallStaticIntMethod,如果这里不改变的话,调用时就会报错了。

在按钮事件中我们再写实现方法

相对来说调用静态方法还是比较简单的,我们看一下运行结果


调用不同类中的方法

最后我们要说一下重点,因为我们在写方法的时候可能会调用的是不同类里面的方法,导航native的方法和要调用的java方法不在同一个类里,遇到这样的方法我们来看一看怎么实现。

我们还是在VaccaeJNI的类中写一个非静态的方法,两个数相乘

然后调用的native的函数,我们直接写在Mainactivity.java中

上图中我们先定义了一个plusFromJNI的参数,输入两个值得到返回数,然后先把按钮事件写了调用方法,接下来我们按ALT+ENTER在C++的文件中生成方法

native-lib.cpp

extern "C"
JNIEXPORT jint JNICALL
Java_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);




}

上面代码中我们主要要关注几个我写了注释的地方,如下图

最后我们再运行一下程序,看看结果

-END-

Vaccae的往期经典


OpenCV

《C++ OpenCV案例实战---卡号获取

《C++ OpenCV案例实战---卡片截取(附代码)

《C++ OpenCV透视变换---切换手机正面图片》

《C++ OpenCV实战---获取数量

《C++ OpenCV实战---利用颜色分割获取数量》


Android

《Android利用SurfaceView结合科大讯飞修改语音实别UI

《Android关于语音识别的功能实现分析(一)---结构化思维》

《Android关于语音识别的功能实现分析(二)---语义解析》

《Android根据类生成签名字符串

《Android碎片化布局fragment的实战应用


.Net C#

《C#自定义特性(Attribute)讲解与实际应用

《C#根据类生成签名字符串(附DEMO下载地址)

《C++创建动态库C#调用》

《C#与三菱PLC(型号FX2N)串口通讯类


数据库及其它

《Oracel存储过程写报表实战》

《Delphi轮播视频和图片程序(用于双屏显示程序)

《SQL随机增加销售数据的脚本编写(附脚本下载地址)


长按下方二维码关注微卡智享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值