前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android NDK编程(四)--- C/C++调用Java中的方法

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

作者头像
Vaccae
发布2019-07-25 11:24:16
1.9K0
发布2019-07-25 11:24:16
举报
文章被收录于专栏:微卡智享微卡智享

前言

上一篇我们介绍了《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-

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档