java使用JNA(Java Native Access)调用dll的方法
JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C、C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so【shared object】文件)。
JNI是Java调用原生函数的唯一机制,JNA就是建立在JNI之上,JNA简化了Java调用原生函数的过程。JNA提供了一个动态的C语言编写的转发器(实际上也是一个动态链接库,在Linux-i386中文件名是:libjnidispatch.so)可以自动实现Java与C之间的数据类型映射。从性能上会比JNI技术调用动态链接库要低。
1.简单写个windows下的dll,文件命名为forjava.dll,其中一个add函数,采用stdcall调用约定
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) __stdcall
#else
#define DLL_EXPORT __declspec(dllimport) __stdcall
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int DLL_EXPORT add(int a,int b);
#ifdef __cplusplus
}
#endif
#endif // __MAIN_H__
main.cpp
#include "main.h"
// a sample exported function
int DLL_EXPORT add(int a ,int b)
{
return a+b;
}
extern "C" DLL_EXPORT BOOL APIENTRY 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
}
2.将jna.jar导入eclipse工程中,java代码如下
//import com.sun.jna.Library; cdecl call调用约定
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;
public class main {
public interface CLibrary extends StdCallLibrary { //cdecl call调用约定时为Library
CLibrary INSTANCE = (CLibrary)Native.loadLibrary("forjava",CLibrary.class);
public int add(int a,int b);
}
public static void main(String[] args) {
System.out.print(CLibrary.INSTANCE.add(2,3));
}
}
相关文章
SpringBoot3.0集成MybatisPlus的实现方法
本文主要介绍了SpringBoot3.0集成MybatisPlus的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-08-08
解析整合mybatis-spring需要的maven依赖配置问题
这篇文章主要介绍了整合mybatis-spring需要的maven依赖配置问题,创建Maven项目,导入相关jar包,文中还给大家提到了,解决maven静态资源约定大于习惯问题,本文给大家介绍的非常详细,需要的朋友参考下吧2021-11-11
使用IDEA创建servlet JavaWeb 应用及使用Tomcat本地部署的实现
本文主要介绍了使用IDEA创建servlet JavaWeb 应用及使用Tomcat本地部署2022-01-01
SpringBoot整合Redis实现登录失败锁定功能(实例详解)
本文我们已经探讨如何利用Redis来实现锁定账户的安全措施,以及通过SpringBoot整合Redis实现了这一功能,感兴趣的朋友跟随小编一起学习下吧2024-02-02
spring mvc4.1.6 spring4.1.6 hibernate4.3.11 mysql5.5.25开发环境搭
这篇文章主要介绍了spring mvc4.1.6 + spring4.1.6 + hibernate4.3.11+mysql5.5.25开发环境搭建图文教程,需要的朋友可以参考下2016-06-06
java.io.UnsupportedEncodingException异常的正确解决方法(亲测有效!)
这篇文章主要给大家介绍了关于java.io.UnsupportedEncodingException异常的正确解决方法,文中介绍的办法亲测有效,java.io.UnsupportedEncodingException是Java编程语言中的一个异常类,表示指定的字符集不被支持,需要的朋友可以参考下2024-02-02


最新评论