JNI&反射?

一、简介

        JNI怎么会和反射联系到一块?在对反射和JNI都还懵懵懂懂的时候,确实不知道怎么会把这两个东西联系到一块,随着对JNI和反射了解的深入越来与发现两者的相似之处,也可以说反射的原理就是JNI的调用.

        反射一般用在想要调用java中一些类私有的方法或不对外开放的类的方法时,深入想想为什么通过反射可以拿到这些私有的方法,java代码是跨平台的,实现这个的机制不可缺少的额就是jvm虚拟机,而jvm虚拟机是封装好的其底层还是调用的c和c++代码,然后在联系到jni的原理中,有种顿悟的赶脚,原来反射就是java代码调用c或c++,然后通过c和c++反向获取一些私有的java方法.

       前两篇博客介绍的java调用c或c++代码,那么c或c++怎么调用java代码呢?

二、c/c++调java

前两篇关于jni的博客有点乱,借此机会写一下完整的过程

1.完整jni调用

  1)要想c/c++调用java,首先要有java调用c/c++才行

    首先声明一个java类,写调用的方法,如下图

                      JNI&反射?_第1张图片

      修饰符要为public native

      而上边的methodInJava为私有的方法,其他类调不了这个方法,下面就通过c/c++代码调用这个私有的方法

 2)通过jdk命令生成.h文件

     在控制台进入到DataProvider的.class文件所在的包名的根目录,输入一下命令集合在根目录生成.h文件,如下图

        JNI&反射?_第2张图片

     图中1,就是AndroidStudio中编译好的class目录,在intermediates目录下

     图中3,javah命令生成.h文件,一定要写所在项目的全路径名

     图中2,编译生成的.h文件

     话说回来这个.h文件用来干嘛的?其实他类似于于java中的接口,我们完全可以手写.h中的内容,但是手写出错的可能性很大,所以就用工具喽

3)在as中配置jni

     如下图

            JNI&反射?_第3张图片

      hello.c文件就相当于是.h文件的实现,里边写具体的c/c++代码(实现底层方法或者反向调用java代码)

      Android.mk是在通过ndk-build.cmd指令编译执行c代码时要读的配置文件,里边主要配置了要被编译的c的代码,以及编译后输出.so动态链接库的名称

      同样在控制台进到jni的目录下执行ndk-build.cmd命令,即可编译出图中obj文件夹下的内容,我这里只是生成了arm处理器下的so文件,如果要x86等其他处理器的so,就要在jni目录下再放一个配置文件Application.mk,在文件中制定好多种处理器,那么在执行ndk-build.cmd命令时就会生成多种so

4)调用c代码(核心)

      先看图

        JNI&反射?_第4张图片

     图中1,是上边反复提到的.h文件中的方法名,这个名字手写很容易出错,所以用的javah工具生成的

            void 返回值类型    后边Java_con_heima_it_cotojava_DataProvider_callMethod,这个名字必须以Java开头,后边紧跟包的全路径,中间全用下划线隔开DataProvider是类名,callMethod是步骤一中写的native方法名

     图中2,c代码真正的核心,在这里可以直接调用c中封装好的代码,也可以反向调用java代码,图中就是反向调用的java代码(无参无返回值的java方法)c代码就不仔细分析了,因为对c研究的不多,知识有限思路就是先找到java中类的二进制文件,然后通过二进制文件找到勒种私有的方法methodInJava,后边的那个“()V”是个很神奇的东西叫做java方法的签名,()代表无参数,V代表Viod无返回值

            这个签名有一定的规范可以手写,当然jdk已经有工具类可以直接生成签名啦

              JNI&反射?_第5张图片

            找到class文件所在的路径,执行 javap -s+路径名+类名,就可生成此类下所有方法的签名,如图中2

5)java调用c

       在activity中开启一个出发事件即可

三、总结

     应用:在智能家具、汽车,智能机器中应用很广泛

     通过这么一分析应该也能知道反射的利弊了,利:可以调用一个比较高级的方法;避:太耗资源了,先调c,c在回调java






你可能感兴趣的:(Android)