Android NDK编程(四)--- C/C++调用Java中的方法

前言

上一篇我们介绍了《Android NDK编程(三)--- Android调用C的函数》,主要是介绍了在Android中怎么调用C/C++中的方法,在我们开发ndk的时候有可能会用到在c/c++代码中回调JAVA中的方法,这一章我们就来介绍一下C/C++中怎么调用Android中的方法。

调Java方法

代码演示之前,这里要重点说出一下C/C++调用JAVA的方法步骤:

Android中Jni可以通过FindClass,GetMethodID, CallObjectMethod等可以实现对java中方法的调用。

GetMethodID中最后一个参数的写法很特殊,
Jni中GetMethodID的定义:
jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)

第一个参数:JNI接口对象;

第二个参数:Java类对象;

第三个参数:参数名(或方法名);

第四个参数:该参数(或方法)的签名。

其中第一个参数方法的签名对照表如下:

例子:

    public void demo1(int a,int b){} //(II)V
     
    public void demo2(String a){} //(Ljava/lang/String;)V
     
    public void demo3(String [] arr){}//([Ljava/lang/String;)V
     
    public int demo4(){return 0;}//()I
     
    public boolean demo5(){return false;} //()Z
     
    public String demo6(String [] a){ return "";}//([java/lang/String;)Ljava/lang/String;
     
    public String[] demo7(){return null;}//()Ljava/lang/String;
     
    public void demo8(String[] a,String[] b){}//([Ljava/lang/String;[Ljava/lang/String;)V
     
    public void demo8(String[] a,int b){}//([Ljava/lang/String;I)V
     
    public void demo9(int[] a,int b){}//([II)V
     //内部类
    // "(Ljava/lang/String;com/ldx/Demo$DemoInnter;)Z"
!

代码演示

还是接着我们一直用的Demo,这次我们先在Java中写一个ShowText的方法,再定义一个native的方法用于调用,如下图

然后在native-cpp下开始写代码

extern "C"
JNIEXPORT void JNICALL
Java_dem_vac_vaccaendk_MainActivity_showtextFromJNI(JNIEnv *env, jobject instance) {


    //查找方法所在的类
    //获取jclass
    jclass jcls=env->GetObjectClass(instance);
    if (jcls == NULL) {
        return;
    }


    //获取方法ID
    jmethodID jmethod=env->GetMethodID(jcls,"ShowText","()V");
    if (jmethod == NULL) {
        return;
    }


    //调用方法
    env->CallVoidMethod(instance,jmethod);


}

然后我们把按钮事件改一下

重新运行程序后显示的界面


我们再增加一个带参数的方法进行处理

然后修改一下我们C/C++里面的那个方法,主要就是修改获取方法的参数

修改后的参数为下图,左上角红框修改了方法参数,然后定义了一个新的字符串,在调用方法的时候把这个参数也输入进去

接下来我们运行程序后点击按钮

-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随机增加销售数据的脚本编写(附脚本下载地址)


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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vaccae

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

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

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

打赏作者

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

抵扣说明:

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

余额充值