歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> JNA調用C語言動態鏈接庫學習實踐總結

JNA調用C語言動態鏈接庫學習實踐總結

日期:2017/3/1 9:46:04   编辑:Linux編程

最新因為項目需要,學習了一下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);

Copyright © Linux教程網 All Rights Reserved