NDK开发c调用Activity中的方法(五)

c调用activity中的方法
1.在某一个类中如MainActivity类中调用showToast方法
在MainActivity中
   /*
    * 让c代码调用activity中的showToast方法
    * */

    public native void callbacShowToast();
    public void showToast(){
        System.out.println("showToast------");
        Toast.makeText(MainActivity.this,"showToast------",Toast.LENGTH_SHORT).show();
    }
2.生成MainActivity的头文件
3.在c代码中实现native方法
    /*
    callbacShowToast方法是MainActivity中的方法 所以FindClass参数传www/basketi/cn/basketball/ccalljavademo/MainActivity
    GetMethodID()参数三 调用java的哪个方法 就传入哪个方法showToast
    然后不需要通过反射获取到实例,直接把(JNIEnv * env, jobject job) 中的job传给CallVoidMethod方法
    */
    JNIEXPORT void JNICALL Java_www_basketi_cn_basketball_ccalljavademo_MainActivity_callbacShowToast
        (JNIEnv * env, jobject job){
             //l利用反射 实例化MainActivity对象
                      //1.得到字节码 www/basketi/cn/basketball/ccalljavademo/MainActivity调用方法所在的类的全类名
                      jclass jclazz=(*env)->FindClass(env,"www/basketi/cn/basketball/ccalljavademo/MainActivity");
                      //2.得到方法  最后一个参数是方法签名
                      jmethodID jmethodIDs=(*env)->GetMethodID(env,jclazz,"showToast","()V");
                          //签名获取的方法:rebuild工程后,app下 build -  intermediates - classes - debug- 右键show in explore -  按住shift + 右键- 在此处打开命令窗口 - javap -s 包名.JNI  回车
                      //3.调用activity中的方法时不需要实例化该类,直接将job传入即可
//                      jobject jobject=(*env)->AllocObject(env,jclazz);
                      //4.调用方法 将job 参数传给java
                      (*env)->CallVoidMethod(env,job,jmethodIDs);
        }
4.java中调用

  MainActivity.this.callbacShowToast();

源码下载位置:http://download.csdn.net/detail/lzq520210/9733872

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值