安卓JNI native回调java

安卓与cpp之间的调用离不开JNI,在安卓JNI静态注册这篇文章我已经演示了java调用c/c++代码,那么c/c++可以调用java中的方法吗?答案是可以的。

三步走:

1,获取jclass

2,获取jmethoid

3,调用java方法

直接上代码。

安卓项目的java代码:

package com.example.jnistaticregister;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private native String YourJNI();//使用native关键字定义一个方法YourJNI

    static {
        System.loadLibrary("MyJNI");    //加载生成的so文件
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView textView = findViewById(R.id.textView);
                String content = YourJNI();
                textView.setText(content);
            }
        });
    }
	//该方法在c++代码中进行的调用
    private void callback(String content) {
        Toast.makeText(this,content,Toast.LENGTH_SHORT).show();
    }
}

c++代码:

#include "MyJNI.h"

void CB(JNIEnv *env,jobject obj);

JNIEXPORT jstring JNICALL Java_com_example_jnistaticregister_MainActivity_YourJNI(JNIEnv *env,jobject obj)
{
    CB(env,obj);
    return env->NewStringUTF("Hi,我是YourJNI,我来自MyJNI.so");
}

//native回调java
void CB(JNIEnv *env,jobject obj){
  	//1,获取jclass
    jclass jc = env->GetObjectClass(obj);
  	//2,获取jmethodid
    jmethodID jm = env->GetMethodID(jc,"callback","(Ljava/lang/String;)V");
    //3, 调用java函数
    //  -- 3.1 ,设置函数参数
    const char *msg = "我是cpp里的CB函数,我回调了java里的callback函数";
    jstring jmsg = env->NewStringUTF(msg);
    //  -- 3.2 ,调用函数
    env->CallVoidMethod(obj,jm,jmsg);
    env->DeleteLocalRef(jmsg);
}

ndk-build后启动AS运行的效果图如下:

%title插图%num

发表回复