java windwos dll_Windows平台使用Java调用Windows API或dll

由于项目的需要,使用Java开发Windows桌面应用,调用外设的C语言写的驱动,看了下jni,过程太复杂,果断放弃。于是在github上找到了下面的项目:

JNA的全称是Java Native Access,你只要在一个java接口中描述本地库中的函数与结构, JNA将在运行期动态访问本地库,自动实现Java接口到本地库函数的映射。

使用maven可以直接加入下面的依赖:

net.java.dev.jna

jna

4.5.1

net.java.dev.jna

jna-platform

4.5.1

项目中有一个QDPos.dll,提供了两个函数用于设备的枚举,其文件头的声明如下:

BOOL WINAPI enumBloothPos(WCHAR* filter,WCHAR* deviceNames[10]);

BOOL WINAPI enumCOMPos(WCHAR* filter,TCHAR* comNames[10]);

对应的jna接口为:

package qdone.pos;

import com.sun.jna.Native;

import com.sun.jna.WString;

import com.sun.jna.platform.win32.WinDef;

import com.sun.jna.win32.StdCallLibrary;

public interface QDPos extends StdCallLibrary {

QDPos INSTANCE = (QDPos) Native.loadLibrary("QDPos", QDPos.class);

/**枚举蓝牙设备*/

WinDef.BOOL enumBloothPos(WString filter, WString[] deviceNames);

/**枚举串口设备*/

WinDef.BOOL enumCOMPos(WString filter, WString[] deviceNames);

}

将QDPos.dll放到类搜索路径下或者Windows系统目录下,保证java在运行时能找到QDPos.dll,直接调用该接口就可以访问dll中对应的C语言实现的函数,以下为java中调用的测试用例:

@Test

public void enumBloothPos() {

QDPos qdPos=QDPos.INSTANCE;

WString[] deviceNames=new WString[10];

WString perfix=new WString("M36");

qdPos.enumBloothPos(perfix,deviceNames);

for(WString deviceName:deviceNames)

{

if(null!=deviceName) {

logger.info("蓝牙设备:{}", deviceName);

}

}

}

@Test

public void enumCOMPos() {

QDPos qdPos=QDPos.INSTANCE;

WString[] deviceNames=new WString[10];

WString perfix=new WString("Landi");

qdPos.enumCOMPos(perfix,deviceNames);

for(WString deviceName:deviceNames)

{

if(null!=deviceName) {

logger.info("串口设备:{}", deviceName);

}

}

}关于java和C语言头文件中数据类型映射,项目中给出了说明:

Default Type Mappings

Java primitive types (and their object equivalents) map directly to the native C type of the same size.

Native Type

Size

Java Type

Common Windows Types

char

8-bit integer

byte

BYTE, TCHAR

short

16-bit integer

short

WORD

wchar_t

16/32-bit character

char

TCHAR

int

32-bit integer

int

DWORD

int

boolean value

boolean

BOOL

long

32/64-bit integer

NativeLong

LONG

long long

64-bit integer

long

__int64

float

32-bit FP

float

double

64-bit FP

double

char*

C string

String

LPTCSTR

void*

pointer

Pointer

LPVOID, HANDLE, LPXXX

Unsigned types use the same mappings as signed types. C enums are usually interchangeable with "int".

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值