使用JNA入門


使用JNA入門
公司連接硬件需要調用底層dll文件命令,特地了解下;正在學習。。
首先導入JNA jar包,筆者是maven項目直接寫pom文件;

<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->

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

<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform -->
<dependency>
    <groupId>net.java.dev.jna</groupId>
<!-- jna-platform中已經集成了jna包 -->
    <artifactId>jna-platform</artifactId>
    <version>5.3.1</version>
</dependency>

  


這是最新的jar包,推薦使用4.x的jar;

定義接口繼承Library 或者 StdCallLibrary ,定義靜態常量 INSTANCE,使用 Native.loadLibrary() 讀取 dll 文件,第一個參數是動態鏈接庫 dll/so 的名稱,但不帶 .dll 或 .so 這樣的后綴,這符合JNI的規范,因為帶了后綴名就不可以跨操作系統平台了;第二個參數是本接口的Class類型。JNA通過這個 Class 類型,根據指定的 .dll/.so 文件,動態創建接口的實例,該實例由 JNA 通過 Java 的反射自動生成。
在 Windows 平台下 printf 函數所在的 dll 庫名稱是 msvcrt,而在其它平台如 Linux 下的 so 庫名稱是 c;
下面列出兩個接口代碼:

public interface CLibrary extends Library {

CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);

void printf(String f);
static {
// dll文件路徑,包括dll文件名稱,不需要.dll后綴。如:E盤下的test.dll文件
Native.register("E:\\test");
}
}

或者是

 

1 public interface StdCallDll extends StdCallLibrary {
2 StdCallDll INSTANCE = (StdCallDll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), StdCallDll.class);
3 
4 void printf(String f);
5 }

 

用main方法調用這兩個方法:

1 public static void main(String[] args) {
2 
3 CLibrary.INSTANCE.printf("CLibrary:Hello,World!\n");
4 
5 StdCallDll.INSTANCE.printf("StdCallDll:Hello\n");
6 }

 

可以看到控制台輸出:

CLibrary:Hello,World!
StdCallDll:Hello

 

如果我們調用其他的dll文件,可以將第一個參數改為dll文件的路徑;
還有就是要注意 Java 到 C 的類型的映射:

 

 

————————————————
版權聲明:本文為CSDN博主「一天oO」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_44721315/article/details/95361102


免責聲明!

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



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