在Eclipse下利用JNI调用C++的函数,遇到了很多问题,经过一番折腾,终于走通整个过程。
一、准备工作。
1、下载Eclipse CDT插件,让Eclipse支持C++的开发。我使用的是Eclipse Luna,已经集成了CDT插件。
2、安装windows下的C++编译环境MinGW。配置MinGW的环境变量,在path中添加%MinGW%\bin的安装路径:我的为C:\MinGW\bin,其他环境变量都无需进行配置。
二、代码示例。
1、新建一个java project ,命名为JniTest,主类为HelloJni.java,代码如下:
public class HelloJni {
public native void displayHelloJni();
static {
System.loadLibrary("libHelloJni");
}
public static void main(String[] args) {
System.out.println(System.getProperty("java.library.path"));
new HelloJni().displayHelloJni();
}
}
2、利用javah生成HelloJni.java中本地函数displayHelloJni对应的头文件。打开cmd,进入HelloJni所在目录,输入命令:javah HelloJni,执行后在同一级目录下生产HelloJni.h。
3、新建一个C++项目,如下图,注意,项目的名称将决定生成的dll文件的名字(当然生成dll后也可以重命名)。
4、将HelloJni.h复制到新建的C++项目HelloJni中,新建一个C++源文件HelloJni.cpp,实现头文件中的方法,HelloJni.cpp的内容如下:
#include <jni.h>
#include "HelloJni.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloJni_displayHelloJni
(JNIEnv * env, jobject obj){
printf("Hello JNI!\n");
return;
}
此时,编译会提示找不到jni.h,需要在项目属性中进行设置,如下图:
此外,还要进行如下设置,在Build----Settings----Tool Settings-----MinGW C++ Linker目录栏下的Miscellaneous选项下,在linker flags处填入:-Wl,--add-stdcall-alias,否则编译出的dll,在调用时,会报java.lang.UnsatisfiedLinkError错误,提示找不到方法。
此时就可以成功编译出libHelloJni.dll了。
5、将libHelloJni.dll复制到JniTest项目的libs文件夹下,libs文件夹自己创建,和src在同一级目录下,方便管理dll文件。为了让程序执行时能找到dll,有两种方式进行设置:方法一、设置Native library Location,如下图:
方法二、设置运行时的参数,依次点击run as---run configurations,在点击Arguments,在Vm arguments处填入如下:-Djava.library.path="${workspace_loc}\JniTest\libs;${env_var:PATH}"。
最后一点要注意的是,因为dll由MinGW生产,是32位dll,如果使用64位jdk调用会出现错误,所以JniTest项目必须使用32位jdk编译,或者安装MinGW-w64,重新生成一个64位dll给64位的jdk使用。至此,示例结束,运行HelloJni,控制台输入消息。