java使用JNA(Java Native Access)调用dll的方法
发布时间:2022-02-06 09:27:34
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));
}
}


猜你喜欢
- 概述异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。异常提供了一种把程序控制权从某个部
- Sentinel数据双向同步上面实现了Nacos单向同步配置规则到Sentinel,但是只是单向的,没有实现Sentinel向Nacos同步
- 一、前言我们先来看下面一个例子:using System;using System.Threading;namespace ThreadSy
- 最近在开发即时通讯这个模块的时候使用到了自定义的相机,需求与微信一样,要求相机能长按和轻点,当时在网上找自定义相机的资源,很少,所以,我在这
- 可以指定编码如:utf-8来写入和读取文件。如果文件编码未知,可以通过该方法先得到文件的编码后再指定正确的编码来读取,否则会出现文件乱码问题
- 首先要解析string类型的xml必须先要将其转化成dom格式,然后再进行解析取值,如下是解析代码示例:package com.compan
- 看门见山1.java中replace API:replace(char oldChar, char newChar):寓意为:返回一个新的字
- Android CardView详解Android5.0中向我们介绍了一个全新的控件–CardView,从本质上看,可以将Car
- 最近部门打算优化下 APP 在低端机上的卡顿情况,既然想优化,就必须获取卡顿情况,那么如何获取卡顿情况就是本文目的。一般主线程过多的 UI
- 1. 布局: GridBagLayout官方JavaDocsApi: java.awt.GridBagLayoutGridBagLayout
- SpringBoot Admin 实现Actuator端点可视化监控简介Actuator可视化监控SpringBoot AdminNote:
- 概述异步这个概念在不同语境下有不同的解释,比如在一个单核CPU里开启两个线程执行两个函数,通常认为这种调用是异步的,但对于CPU来说它是单核
- 实例如下:MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean(); &
- 之前一直在Android应用层上做工作,最近开始研究Android平台上的东东了,主要是在Android Frameworks层和系统库层进
- 有一种方法可以阻止父层的View截获touch事件,就是调用 getParent().requestDisallowInterceptTou
- 许多开发人员对异步代码和多线程以及它们的工作原理和使用方法都有错误的认识。在这里,你将了解这两个概念之间的区别,并使用c#实现它们。我:“服
- 本文实例讲述了C#读写INI文件的方法。分享给大家供大家参考。具体如下:虽然微软早已经建议在WINDOWS中用注册表代替INI文件,但是在实
- JDK * 实现原理 * 机制通过实现 InvocationHandler 接口创建自己的调用处理器通过为 Proxy 类指定 Clas
- 一、Spring Boot Admin 的概念 Spring Boot Admin是一个
- 今天来了一个问题:软键盘无法弹出。分析后是因为系统判断当前有外接硬键盘,就会隐藏软键盘。但实际情况并不是这么简单,该问题只有在特定条件下偶现