一、Windows版本
1、创建工作目录JNIDemo。
2、编写包含本地方法的Java类JNIDemo.java。
首先为Java的package在工作目录下创建文件夹层次结构test/jni/demo,在该子目录下创建Java源文件。
3、设置环境变量,为编译Java源文件和产生C代码头文件做准备,前提是要实现设置好JAVA_HOME和CLASSPATH环境变量,否则相应指定需要的绝对路径。
4、编译Java源文件。
5、产生C头文件。
6、此时工作目录下将生成jnidemo.h文件,新建jnidemo.c文件实现该本地接口。
7、编译动态库,由于不想启动msdv,所以使用namke和cl.exe、link.exe解决它。
设置环境变量后编写makefile,内容如下。
之后顺序执行nmake javah、nmake all、nmake run即可见到jni接口执行效果,首先消息框显示java输入的参数,点击确定后控制台打印jni方法返回的字符串。
二、Linux版本
由于实现方式类似,仅编译工具和使用的API不同,过程不再赘述,仅给是文件内容、命令和运行效果。
1、创建工作目录。
2、Java源文件和windows版的一致,仅修改提示信息。
3、直接编写makefile搞定剩下的事。
4、产生头文件。
5、修改jnidemo.c。
6、编译并运行。
三、总结
别人所jni是双刃剑,使好了很有用处,否则带来一堆烦恼,正如c代码中标注的危险代码部分,如果Java方法输入的参数足够大,导致msg数组无法容纳,sprintf将引发问题,由于通常都是通过jvm启动并载入动态库本地方法,本地方法和jvm使用同一地址空间,本地方法crash将导致jvm奔溃直接退出,如果这种情况放生诸如WebLogic等追求很大稳定性的中间件之上,后果可想而知,所以这洪水能回避就尽量回避,除非本地接口简单得出错的几率都没有,又或者编写者非常神仙能把握好它。