最新因為項目需要,學習了一下JNA框架,在這裡記錄一下學習和使用心得,給大家分享,希望能幫助新手。
本文主要講解如何使用JNA框架輕松調用C語言動態鏈接庫,如何使用JNA模擬C語言參數(例如數組、指針等)。
JNA(Java Native Access)框架是一個開源的Java框架,是SUN公司主導開發的,建立在經典的JNI的基礎之上的一個框架。
JNA官網地址:https://github.com/twall/jna
官網上有很多例子和學習入門教程,建議認真閱讀,很有幫助,比自己網絡上到處搜索效果好多了。
Maven項目引入JNA:
<!--Java JNA -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.1.0</version>
</dependency>
引入JNA:
import com.sun.jna.*;
import com.sun.jna.ptr.*;
1.構造JNA模擬類
C語言函數:
void function1(int a, int b, const unsigned char* data);
char * function2(float * pVal, char * outString);
void function3(Rect * pRect, Rect rect);
JNA模擬:
public interface MyLibTest extends Library {
//定義結構體
public static class Rect extends Structure {
//公共字段的順序,必須與C語言中的結構的順序一致,否則會報錯!
public int left;
public int top;
public int right;
public int bottom;
//結構體傳指針
public static class ByReference extends Rect implements Structure.ByReference { }
//結構體傳值
public static class ByValue extends Rect implements Structure.ByValue{ }
@Override
protected List getFieldOrder() {
return Arrays.asList(new String[]{"left", "top", "right", "bottom"});
}
//加載庫文件
MyLibTest INSTANCE = (MyLibTest) Native.loadLibrary("C:\libTest\CLib.dll",MyLibTest.class);
//函數模擬
void function1(int a, int b, char[] data);
String function2(FloatByReference fRef, char [] outString);
void function3(Rect.ByReference pRect, Rect.ByValue rect);
}
調用方式:
char[] arr1 = new char[數組大小];
function1(1, 2, arr1);
char[] arr2 = new char[數組大小];
FloatByReference fRef = new FloatByReference(0.1F);
String result = function2(fRef, arr2);
Rect.ByReference pRect = new Rect.ByReference(); //指針對象
Rect.ByValue rect = new Rect.ByValue(); //傳值對象
function3(pRect, rect);