java 調用 windows 動態鏈接庫(.dll)之 JNA 的使用


首先是 JNA 需要的兩個 依賴包

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.2.0</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>5.2.0</version>
</dependency>

項目中 dll 文件存放位置

兩種方式存放,選擇任意一種都可以(推薦第一種)

  1. 項目 resources 目錄下新建文件夾:win32-x86-64 ,並將 dll 文件放入其中

  2. 放入操作系統目錄中 windows/system32/

JNA 的實現 demo

找到一個 dll 需要實現的接口(可以從對應的.h 文件中查找)

HANDLE __stdcall device_open(__int16 port,unsigned long baud);

在 JAVA 代碼中調用接口(C/C++與 JAVA 類型對照表請往下看)

import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.win32.StdCallLibrary;

public class JnaDemo {

    public interface MTX32 extends StdCallLibrary {
        /**
         * 參數1:需要調用的dll文件名
         */
        MTX32 INSTANCE = Native.load("mtx_32", MTX32.class);

        /**
         * 根據C與java參數對照表寫出對應接口
         */
        HANDLE device_open(Short port, NativeLong baud);
    }

    public static void main(String[] args) {
        //調用接口
        MTX32 mtx32 = MTX32.INSTANCE;

        HANDLE handle = mtx32.device_open((short) 1, new NativeLong(115200, true));

        System.out.println(handle);
    }
}

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM