Java调用Dll

来源:互联网 发布:萤石软件下载 编辑:程序博客网 时间:2024/06/13 23:28

参考文章: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对象,不知道该怎么传参,查了很多资料无果,希望有高手帮忙指点一下

原创粉丝点击