目录
目录前言
在我们进行NDK开发的时候,有些情况需要在Native层调用Java层的方法,这时候我们可以通过jni提供的方法通过反射的原理来调用Java层的方法。
Java中声明Native方法
新建类NativeCallJavaMethod并创建两个方法,一个是Native方法,另一个是被Native调用的Java方法。
public class NativeCallJavaMethod {
/**
* 通过次Native方法调用Java的方法
* @param msg
*/
public native void NativeCallJava(String msg);
/**
* 被Native调用的Java方法
* @param msg
*/
public void javaMethod(String msg){
Log.e("我是通过Native调用的Java方法",msg);
}
}
Native代码中对方法进行定义
-
生成Java中方法的签名,接下来Native代码中调用Java方法需要使用,这里可以在Android Studio中添加一个External Tools方便生成方法签名,具体步骤如下:
(1)打开File->Settings->External Tools,点击右边绿色小加号添加一个tool
(2)对新建的tool进行配置
Name: javap
Program: javap
Parameters: -s $FileClass$
Working directory: $ModuleFileDir$\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes
- 在C代码中对Native方法进行定义(快速生成Native方法头文件的操作请看Android NDK开发小技巧)
JNIEXPORT void JNICALL Java_com_hehuidai_ndkdemo01_NativeCallJavaMethod_NativeCallJava
(JNIEnv * env, jobject jobj, jstring jstr) {
//1.找到Java中要调用方法所在的类
//参数解释:
//第一个参数:这个直接填传递过来的env即可
//第二个参数:方法所在类的全路径
jclass jclazz = (*env)->FindClass(env, "com/hehuidai/ndkdemo01/NativeCallJavaMethod");
//判断是否找到
if (jclazz == 0) {
//找不到则返回
return;
}
//2.获取到类中对应的方法
//参数解释:
//第一个参数:这个直接填传递过来的env即可
//第二个参数:第一步产生的jclass
//第三个参数:Java中要调用的方法的名称
//第四个参数:Java中方法的签名
jmethodID method = (*env)->GetMethodID(env, jclazz, "javaMethod", "(Ljava/lang/String;)V");
if (method == 0) {
//找不到方法则返回
return;
}
//3.调用方法
//第一个参数:这个直接填传递过来的env即可
//第二个参数:这个直接填传递过来的jobj即可
//第三个参数:上一步产生的jmethodID
//第四个参数:直接填写传递过来的jstr即可,当然也可以通过NewStringUTF自己创建一个
(*env)->CallVoidMethod(env, jobj, method,jstr);
}
调用结果
//通过按钮进行调用
findViewById(R.id.bt_array).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new NativeCallJavaMethod().NativeCallJava("我是Java调用Native方法传的参数");
}
});
网友评论