java native interface
一概念:
jni是JAVA标准平台中的一个重要功能,在java实现跨平台的同时,也能与其它(如c c++)的动态库进行交互.
二: 实现步骤.
1:编写带有native方法的java类: iphone.java
2:编译这个java类: javac iphone.java
3:用javah生成与native方法对应的头文件: javah -jni iphone
4:使用c或者c++语言实现头文件方法.
5:生成动态库: gcc -Wl,--kill-at -shared hello.c -o hello.DLL
6:在程序中加载库文件,即可使用工具类中的方法.
三:开发中一些错误处理:
错误1: java.lang.UnsatisfiedLinkError: no XXX in java.library.path
即“找不到XXX在库路径下”,则需要将生成的DLL拷至系统可检测的PATH路径中。可检测PATH路径可由以下Java语句获得:
String str = System.getProperty("java.library.path");
System.out.println(str);
解决办法:你可以把dll库文件放到打印出来的目录下, 或者自己在环境变量 PATH 中添加一个目录,然后把dll库拷贝到这个目录,推荐后者做法,这样方便对自己编写的dll库进行管理.
错误2:java.lang.UnsatisfiedLinkError:
已经加载dll库文件成功,但是连接函数的时候出错,可能原因是dll库中函数名或参数和头文件不一致,导致找不到该函数的实现,我自己遇到的是编译时候没有正确使用编译选项,导致编译出来的函数多了@符号
在编译c c++程序时编译使用不正确会导致编译出来的函数多一个@符号,遇到不名错误时可以使用DLLExportViewer工具查看dll库中的函数名或者参数是否与头文件的声明的一致.
这里附上mingw官网推荐的编译方法: