关于JNI的解析

来源:互联网 发布:昆明职称网络申报系统 编辑:程序博客网 时间:2024/06/05 12:05

        很多程序员都是比较有好奇心的,比如android开发中java还可以调c/c++,这个已经不是新知识了,很多人已经很熟悉了,但是也有一些刚刚想入门的朋友,今天就说一下JNI是什么东东。

        首先,JNI是java代码访问c/c++的中间层,所以你得先有c/c++库,才能用JNI,而这个库就是.so文件了,首先看一个项目的目录,这是一个android播放器项目,这里的播放器的播放,编码解码和显示都是在c++层实现的,java层只是调用这些接口就可以了。先看图

       比如这些库是在跳入一个界面的时候使用,那先像上图那样把库加载进来,加载完这个app就可以用这些库了。

        因为这些函数都是本地函数(实现是在c++层),所以前面加一个native,表示这是本地函数。


                                                                                                              

       现在库也加载了,native函数也有了,然后就直接调用就可以了,这个时候java层的函数是怎么找到c++层的对应的函数的呢?   

这里有两种方法可以让java层函数找到对应c++层函数,一个叫静态注册,一个叫动态注册,因为android很多库都是用动态注册的今天就主要讲动态注册,静态注册是需要用javah工具生成头文件,再实现这些头文件,自己去查吧,那现在需要到c++层代码里面找这个所谓的动态注册。


       先看gMethods数组,有没有发现左边的就是java层的函数,中间的是参数(这个自己百度或谷歌),而右边的就是c++层的函数了,下面有个register_player函数,gMethods作为一个参数传过去的,那register_player是什么时候调用的呢,先说一个知识点,当java层调用system.loadLibrary()的时候这个库会先调用JNI_OnLoad()方法。

                             
       这两个方法是一个工具类里面的方法,因为有extern关键字所以是在上面的类里面实现的,
      
                             

        这是工具类的JNI_OnLoad方法,在这里面调用register_player方法。

       

        这只是关于JNI的部分,有人想知道怎么打.so库,怎么用c++开发android,这些问题以后再写博客了,大家一起学习一起进步。


0 0
原创粉丝点击