歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

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