很多程序员都是比较有好奇心的,比如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,这些问题以后再写博客了,大家一起学习一起进步。