参考文章:http://blog.csdn.net/gcangle/article/details/8504629
一、生成dll文件
不会写C代码的同学,建议下一个Dev-cpp来练手,新建一个Dll项目,将其中的.cpp文件和.h文件内容改成以下代码:
①main.h 改写成
#ifndef __MAIN_H__
#define __MAIN_H__
#include <windows.h>
/* To use this exported function of dll, include this header
* in your project.
*/
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int add(int a,int b);
int factorial(int n);
#ifdef __cplusplus
}
#endif
#endif // __MAIN_H__
②main.cpp改写成
#include "main.h"
int add(int a,int b){
return a + b;
}
int factorial(int n){
int i;
int r = 1;
for(i=1;i<n+1;i++)
r = r*i;
return r;
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}
然后点击项目属性,设置生成dll文件的名称路径,然后编译,就可以在你指定的目录找到扩展名为dll的文件。
将这个dll文件复制到Java安装目录下的bin目录中,文件名称是可以更改的。
二、java代码
①编写一个interface
public interface JNATestDll extends Library {
JNATestDll instanceDll = (JNATestDll) Native.loadLibrary("mydll", JNATestDll.class);
public int add(int a, int b);
public int factorial(int n);
public int asd(int n);//这个方法dll中不存在
}
mydll这个名称需要和刚才复制到bin目录下的文件名称一致
②编写测试类
@Test
public void test3() {
int add = JNATestDll.instanceDll.add(2, 3);
// int ft = JNATestDll.instanceDll.factorial(10);
System.out.println("add = " + add);
}
如果正常输出结果,表示java调用dll成功。
JNI也是可以实现的,实现比较复杂,函数名称需要根据java包名等对应,参数类型也需要对应。
我在开发中,碰到一个问题是,dll中要求传一个c++里面的Socket对象,不知道该怎么传参,查了很多资料无果,希望有高手帮忙指点一下