美文网首页Android-NDK/JNI
Android NDK开发:Native层利用反射调用Java层

Android NDK开发:Native层利用反射调用Java层

作者: itfitness | 来源:发表于2019-07-19 17:34 被阅读7次

目录

目录

前言

在我们进行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代码中对方法进行定义

  1. 生成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
  1. 在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方法传的参数");
            }
        });

相关文章

网友评论

    本文标题:Android NDK开发:Native层利用反射调用Java层

    本文链接:https://www.haomeiwen.com/subject/tkbslctx.html