1. 环境
Windows7-64Bit
VS2010-32Bit
JDK1.8-64Bit
2. 步骤
2.1 创建NativePrint类
public class NativePrint { public native void nativePrint(); }
其中包含一个native方法,这个native方法是通过C++实现的,C++的实现代码最终是生成dll文件,然后通过Java调用。
2.2 编译NativePrint类以及生成头文件
使用命令javac NativePrint.java编译,然后在通过javah NativePrint命令生成头文件,具体如下:
命令:
生成的文件:
其中NativePrint.h的文件内容为:文件内容不可以修改
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class NativePrint */ #ifndef _Included_NativePrint #define _Included_NativePrint #ifdef __cplusplus extern "C" { #endif /* * Class: NativePrint * Method: nativePrint * Signature: ()V */ JNIEXPORT void JNICALL Java_NativePrint_nativePrint (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
2.3 C++实现NativePrint.nativePrint()方法
(1)安装VS2010版本,然后创建一个32位dll的空项目,具体步骤:文件 -> 新建项目 - > Win32 - > Win32控制台命令程序,然后下一步,做如下设置:
(2)拷贝
D:\Program Files\Java\jdk1.8.0_111\include\win32\jawt_md.h
D:\Program Files\Java\jdk1.8.0_111\include\win32\jni_md.h
D:\Program Files\Java\jdk1.8.0_111\include\jni.h
NativePrint.h
四个文件拷贝到D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include,备注:具体目录请参考自己本地的jdk和VS2010的安装目录;
(3)在native_print工程的源文件目录下,创建NativePrint.cpp文件,内容如下:
#include <jni.h> #include <stdlib.h> #include <NativePrint.h> #ifdef __cplusplus extern "C" { #endif /*这个方法名称一定要和头文件的一模一样,不过头文件中的参数只有类型,没有名称,需要加成如下参数*/ JNIEXPORT void JNICALL Java_NativePrint_nativePrint(JNIEnv *jenv, jobject jobj) { /*就打印这一条语句*/ printf("=====888"); } #ifdef __cplusplus } #endif
2.4 编译64位的dll文件
2.4.1 配置64的编译环境
因为整个环境都是在64位进行,而VS2010的默认创建的工程都是32位的,需要修改。备注:如果不使用64位的dll则会报错 java.lang.UnsatisfiedLinkError: D:\Program Files\Java\jdk1.8.0_111\bin\native_print.dll: Can‘t load IA 32-bit .dll on a AMD 64-bit platform
(1)点击工具栏上面的配置管理器,如图
(2)找到“活动解决方案平台(P)”点击新建
(3)选择x64,然后保存即可。
2.4.2 编译
然后按F7,就可以在工程目录下面生成一个与工程同名的dll文件,如下:注意是在x64目录下面
备注:如果在运行过程中遇到如下错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏, 请参考http://blog.csdn.net/kevin_mqj/article/details/22981873
2.5 运行
将生成的dll文件拷贝到java.library.path目录下面,比如D:\Program Files\Java\jdk1.8.0_111\bin
创建一个测试java测试类,如Test.java
public class Test { static { System.loadLibrary("native_print"); } public static void main(String[] args) { new NativePrint().nativePrint(); } }
然后运行Test.java
结果截图:
参考资料
http://blog.csdn.net/oscar999/article/details/7895367
http://blog.csdn.net/seanwang_25/article/details/17285505
http://blog.csdn.net/l527719041/article/details/77434652
http://blog.csdn.net/fenglibing/article/details/4300381
http://blog.csdn.net/kevin_mqj/article/details/22981873
https://stackoverflow.com/questions/8113080/cant-load-ia-32-bit-dll-on-a-amd-64-bit-platform