首页
学习
活动
专区
圈层
工具
发布

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类对象;

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

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

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

例子:

代码语言:javascript
复制
    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下开始写代码

代码语言:javascript
复制
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-

下一篇
举报
领券