JNI心得 - (四)C++ 调用 java函数

获取代码

接着上一节,这一节来写一下如何用本地代码调用java函数。首先在MainActivity.java声明一个本地方法

    public static native void callBack(MainActivity activity);

然后将生成的代码移到cpp文件中

JNIEXPORT void JNICALL Java_com_example_test_jnitest_MainActivity_callBack
        (JNIEnv *env, jobject,jobject mainActivity){
    
}

上面有一个jobject类型的参数,这个参数是自动生成的,如果这个函数是非static的则这个参数位置就是jobject类型的,代表调用此函数的类的实例的引用,如果这个函数是静态的则这个位置大参数类型为jclass,代表调用此函数的类的引用。出于方便我们就调用MainActivity的函数,在MainActivity.java 加一个供调用的函数

    void onCallBack(int flag){
        Log.i(TAG, "onCallBack: "+flag);
    }

一切就绪,接下来就来看看如何在jni层实现调用

首先根据参数mainActivity 来获取java的class类.jni层用jclass表示java的class

    jclass  mainClass = env->GetObjectClass(mainActivity);

然后再根据mainClass来获取jmethodID,jmethodID表示java方法

    jmethodID  jmethodID1 = env->GetMethodID(mainClass,"onCallBack","(I)V");

GetMethodID()里参数的意思是在mainClass所代表的类里面找到一个名叫onCallBack的函数他只有一个int类型的参数,他的返回值值是void.

 

获取到methodId之后就可以调用javac函数了

    env->CallVoidMethod(mainActivity,jmethodID1,101);

调用之后还要delete掉本地对象,因为jni的申请本地对象资源是有限的,所以要尽量在本地对象不用的时候delete掉,以便节省资源。

    env->DeleteLocalRef(mainClass);

完整代码如下

JNIEXPORT void JNICALL Java_com_example_test_jnitest_MainActivity_callBack
        (JNIEnv *env, jobject,jobject mainActivity){

    jclass  mainClass = env->GetObjectClass(mainActivity);


    if(mainClass == nullptr)
        return ;
    jmethodID  jmethodID1 = env->GetMethodID(mainClass,"onCallBack","(I)V");

    if(jmethodID1 == nullptr)
        return;

    env->CallVoidMethod(mainActivity,jmethodID1,101);

    env->DeleteLocalRef(mainClass);


}

获取项目代码

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值