java调用c++生成的dll

来源:互联网 发布:长寿行知计算机老师 编辑:程序博客网 时间:2024/06/05 09:53

   最近在做的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



将DLLTest.dll拷贝到java项目和src同级的目录下


修改DLLTest.java后成功调用


0 0