安卓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运行的效果图如下:
