第一步,定义一个java类型的interface接口:
public interface JniTestInterface {
void onEvent(String s);
}
第二步,定义一个jni方法,形参为JniTestInterface接口类:
public native void setInterface(JniTestInterface listener);
第三步,JNI函数的C++实现:
extern "C" JNIEXPORT void JNICALL Java_com_dongnao_ndk_jni_JniNative_setInterface(JNIEnv *env, jobject thiz, jobject jobj) { assert(jobj); jclass jclz = NULL; jclz = env->GetObjectClass(jobj); assert(jclz); jmethodID jmethodId = env->GetMethodID(jclz, "onEvent", "(Ljava/lang/String;)V"); jstring msg = env->NewStringUTF("success"); env->CallVoidMethod(jobj, jmethodId, msg); env->DeleteLocalRef(msg); env->DeleteLocalRef(jobj); env->DeleteLocalRef(jclz); }
第四步:Java层实现接口类:
public class JniPracticeActivity extends AppCompatActivity implements JniNative.JniTestInterface{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.id.xxxx);
//接口实现
xxxx.setInterface(this);
}
@Override
public void onEvent(final String s) {
Toast.makeText(this, "访问: " + s, Toast.LENGTH_SHORT)
.show();
}
}