Java 之JNI基础篇(一)

版权声明:本文为博主原创文章,转载请注明出处。http://blog.csdn.net/yingshukun https://blog.csdn.net/yingshukun/article/details/79053061

JNI,即Java Native Interface。它其实就是一套java与本地代码交互的接口或者说是一个协议。通俗的比喻,就是中国人讲中国话,日本人讲日本话,于是中国人碰到日本人,各说各话,无法交流。如果这个时候,中国人学会了英语,日本人也学会了英语,那么中国人日本人就可以用英语交流了,这就是要学习JNI的原因!Java语言无法直接调用C/C++代码,反之亦然,于是就有了JNI,帮助两者相互调用。当然,这一套机制并不是那么美好,总会有一些坑要踩,就像中国人跟日本人交流还需要借助英语,怎么看都有一些多余,我们直观的感觉就是,讲同一种语言更好。

这里写图片描述

在Java的JNI参考手册中,明确指出了使用JNI的一些缺陷,因此,在真实项目中,如果要使用JNI,尽量三思而后行。既然JNI不被推荐使用,那么学习JNI的意义是什么呢?作为一个Android平台的开发者,最幸福的事情就是系统开源,这个开源的系统实际上就是一个巨大的宝库,从底层到上层,可以汲取无数的知识,而在Android系统中,JNI技术是被大量使用的,要想深入的研究学习源码,JNI是必须要掌握的一步,因此,就先从Java语言的JNI基础开始吧!

工具的选择

Linux平台就不说了,在windows平台,编写C代码,最被推荐的工具当然是visual studio,功能丰富,但我个人感觉,太过于笨重臃肿,毕竟咱们不是真正的WinC开发者,不同的需求,决定了不同的选择,Eclipse对我们来说才更加亲切吧,我这里主要推荐三种,注意排名分先后

  • Eclipse + MinGW GCC组合
    咱们毕竟只需要玩玩标准C,而不是Windows平台上的开发者,不需要微软的SDK,这个组合很轻量级,还可以在Java代码与C代码之间轻松切换

  • Code::Blocks
    这个轻量级IDE自带MinGW GCC编译器,写写JNI中的C确实是够了,如果你不喜欢Eclipse写C,可以考虑一下

  • Visual Studio
    微软粉,并且想在Windows平台写写程序,那么vs是你唯一的选择

JNI编写流程

这里写图片描述

以上为官方文档中给出的编写流程,实际上我认为可以简化为四个步骤

  1. 在Java类中编写native方法
    这里写图片描述

  2. 生成头文件
    这里稍微注意一点,生成头文件之前,将项目编译一下,通常Eclipse工程会自动编译,但最好还是手动Build,编译生成class之后,执行javah命令自动生成头文件,
    进入java工程根目录,执行以下命令,其中-o命令主要用于指定头文件名称
    javah -jni -classpath ./bin -o Hello.h com.test.JniUtil

  3. 实现头文件中的方法
    这里写图片描述

    这里有几个小坑说明一下,编写JNI的本地方法,首先要导入jni.h头文件,这个文件在jdk目录里面,另外在windows平台的JNI中,还需要导入jni_md.h头文件,否则无法编译,其他平台不需要,注意头文件的排列顺序,jni.h必须在前。最后将我们生成的头文件也拷过来包含一下,这是一个很好的C编程习惯,能检查一些因手滑导致的错误。

  4. 编译成动态库,并在java中加载
    我们知道,windows平台上的动态库是一个.dll的文件,Linux以及Android上,则是.so文件。最后在Java中加载动态库,则同样可以使用两种方式,如JniUtil类中的static代码块中,分别为System.loadLibrary和System.load函数。

通过如上四个大步骤,即完成了整个Java的jni编写流程,最后调用一下native方法,完成验证

public class test {

    public static void main(String[] args) {
        new JniUtil().sayHello();
    }
}

在这里,我想细化一下在Eclipse中编写以及编译C代码的过程。

  • 成功配置MinGW GCC编译器环境
    下载MinGW GCC编译器,并在Path环境变量中配置gcc命令,即将MinGW中的bin目录配置进去,这个过程就跟配置jdk是一样的,最后在命令行输入gcc --version命令检查是否配置成功

  • 在eclipse中安装CDT插件
    推荐直接在插件商店中搜索安装,无需到处去下载离线包
    选择eclipse工具栏中的Help–>Eclipse Marketplace进入插件商店,在其中搜索cdt并安装,成功安装后重启

  • 创建C语言工程
    New Project中选择C项目
    这里写图片描述
    这里写图片描述

  • 添加头文件路径
    这里写图片描述
  • 配置生成dll动态库
    这里写图片描述

附上一个JNI的高清官方文档
http://download.csdn.net/download/yingshukun/10205404

内容丰富的在线文档
https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html

猜你喜欢

转载自blog.csdn.net/yingshukun/article/details/79053061