Java調用dll動態鏈接庫——JNA框架


1.JNA框架

  a.定義:JNA(Java Native Access)框架是一個開源的Java框架,是SUN公司主導開發的,建立在經典的JNI的基礎之上的一個框架

  b.作用:JNA提供一組Java工具類用於在運行期動態訪問系統本地庫(native library:如Window的dll)而不需要編寫任何Native/JNI代碼。開發人員只要在一個java接口中描述目標native library的函數與結構,JNA將自動實現Java接口到native function的映射。

  c.導入maven依賴

  <dependencies>

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

    ......

  </dependencies>

 

 

2.調用系統自帶動態鏈接庫

public class TestPrintf {

    public interface CLibrary extends Library {
        // DLL文件默認路徑為項目根目錄,若DLL文件存放在項目外,請使用絕對路徑
        CLibrary INSTANCE = (CLibrary) Native.load((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
        // 聲明將要調用的DLL中的方法(可以是多個方法)
        void printf(String format, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i=0;i < args.length;i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }
    }
}

 

 

3.調用自定義dll

  a.在VC2019中創建新項目,命名為TestDll1

 

 

  b.創建頭文件 test.h

#pragma once

#define MYLIBAPI extern "C" _declspec(dllexport) 
MYLIBAPI int sum(int a, int b);

 

 

  c.創建源文件 test.cpp

#include "pch.h"
#include "test.h"
#include <stdio.h>

int sum(int a, int b) {
    return a + b;
}

 

 

  d.在工具欄選擇x64(32位則選擇x86)

 

 

  e.點擊項目TestDll1,右鍵選擇“生成”,生成dll

 

 

  f.將生成的dll放入resource中

  g.創建測試類

public class TestDll {

    public interface TestDllLib extends Library {
        // DLL文件默認路徑為項目根目錄,若DLL文件存放在項目外,請使用絕對路徑
        TestDllLib INSTANCE = (TestDllLib) Native.load("TestDll1", TestDllLib.class);
        // 聲明將要調用的DLL中的方法(可以是多個方法)
        int sum(int a, int b);
    }

    public static void main(String[] args) {
        int result = TestDll.TestDllLib.INSTANCE.sum(2, 3);
        System.out.println("result: " + result);
    }

}

 

  h.注意:運行前需要用maven執行 clean package,保證 dll 打包進 target 中,不然可能報無法找到dll的錯誤

 

  i.JNA數據類型對應關系

 

 

  i.參考文檔:https://blog.csdn.net/shendl/article/details/3589676


免責聲明!

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



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