最近在做的java项目中,有一段功能需要用c++实现,并生成dll,继而在java项目中得以调用。网上有很多类似教程,但是经过本人实践,大多报错,也在这上面浪费了蛮久的时间,最后终于搞定!因此在这里记录操作步骤,一方面给他人提供资料,另一方面也便于自己在下次遇到同样问题时,回头查阅。
第1步 创建Java工程,命名DllTest,创建一个包com.DT.DLL,并在包中添加DllTest.java
第2步 在DllTest.java类中添加native方法
1
2 3 4 5 |
package com.DT.DLL;
public class DLLTest { public native static void set(int i); public native static int get(); } |
第3步 使用javah命令生成头文件
执行cmd命令,先进入项目的src目录;
在src目录下执行如下javah命令(黄色部分代表包名),生成 com_bk_jnidemo_JniDemo.h 头文件
执行完毕后刷新项目,可以看到生成了com_DT_DLL_DLLTest.h头文件:
内容如下:
Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> /* Header for class com_DT_DLL_DLLTest */ #ifndef _Included_com_DT_DLL_DLLTest #define _Included_com_DT_DLL_DLLTest #ifdef __cplusplus extern "C" { #endif /* * Class: com_DT_DLL_DLLTest * Method: set * Signature: (I)V */ JNIEXPORT void JNICALL Java_com_DT_DLL_DLLTest_set (JNIEnv *, jclass, jint); /* * Class: com_DT_DLL_DLLTest * Method: get * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_DT_DLL_DLLTest_get (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif |
第4步 将jdk中的jni.h、jni_md.h拷贝到VS安装目录下的VC\include文件夹下
其中jni.h在jdk的include目录下
jni_md.h在jdk的include\win32目录下
第5步 创建DLL项目
创建后生成的DLLTest.cpp默认如下:
第6步 替换头文件并实现方法
用com_DT_DLL_DLLTest.h中的内容,拷贝替换掉DLLTest.h中的内容
根据上一步更新的DLLTest.h中定义的函数,改写DLLTest.cpp,实现定义的方法:
第7步 生成dll
选择Release之后,在配置管理器中新建平台X64.
格外注意:如果开发java项目的机器上没有装VS,右键项目->属性->c/c++->代码生成->运行库中删掉(留白)/MD,如下图:
第7步 生成dll
点击调试生成dll
将DLLTest.dll拷贝到java项目和src同级的目录下
修改DLLTest.java后成功调用