java使用jni调用本地c动态库文件

java native interface


一概念:

jni是JAVA标准平台中的一个重要功能,在java实现跨平台的同时,也能与其它(如c c++)的动态库进行交互.

java使用jni调用本地c动态库文件_第1张图片
java使用jni调用本地c动态库文件_第2张图片

二: 实现步骤.

java使用jni调用本地c动态库文件_第3张图片
java使用jni调用本地c动态库文件_第4张图片

1:编写带有native方法的java类:  iphone.java

2:编译这个java类: javac iphone.java

3:用javah生成与native方法对应的头文件:  javah -jni iphone

java使用jni调用本地c动态库文件_第5张图片

4:使用c或者c++语言实现头文件方法.

java使用jni调用本地c动态库文件_第6张图片

5:生成动态库: gcc -Wl,--kill-at -shared  hello.c -o hello.DLL

6:在程序中加载库文件,即可使用工具类中的方法.

java使用jni调用本地c动态库文件_第7张图片

三:开发中一些错误处理:

错误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官网推荐的编译方法:

JNI-MinGW-DLL

你可能感兴趣的:(java使用jni调用本地c动态库文件)