java使用JNA庫框架調(diào)用dll動態(tài)庫

寫在前面:最近碰到個項目,客戶是搞C語言的,需求要在項目中開放接口調(diào)用現(xiàn)成的dll文件
然后去了解了下Java中調(diào)用dll的幾種方式,總的有三種:JNI、JNA、JNative。其中JNA調(diào)用DLL是最方便的。

注意:要調(diào)用的DLL位數(shù)要與JDK位數(shù)相同,若dll為32位則jdk也要32位的,若dll為64位的,則jdk為64位的,否則無法調(diào)用。

·JNI

image

·JNA

image

·JNative

image
java使用 JNI來調(diào)用dll動態(tài)庫的調(diào)用,工作量略大,一般情況下開發(fā)人員會選用JNA或JNative。

使用JNative調(diào)用DLL除了要引入jar包外還需要額外引入一個dll文件,而JNA只需要引入jar即可使用。

代碼示例
本代碼示例基于 64位 win10

添加需要的依賴

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.3.1</version>
</dependency>
// c++  需要在 vs 中編譯成 dll
int AddXY(int x, int y) {
    return x+y;
}

Java代碼

    public interface CLibrary extends Library {
        // DLL文件默認路徑為項目根目錄,若DLL文件存放在項目外,請使用絕對路徑
//        CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
//                CLibrary.class);
        // 下面目錄是我本地測試文件路徑
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary("C:\\Users\\zl\\Desktop\\Dll2_x64", CLibrary.class);

        // 聲明將要調(diào)用的DLL中的方法(可以是多個方法)
        int AddXY(int x, int y);
    }

    public static void main(String[] args) {
        int xy = CLibrary.INSTANCE.AddXY(2, 3);
        System.out.println(xy);
    }

運行結(jié)果:


image.png

完整代碼如下:

package com.redis.lock.demo.dll;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;

/**
 * JNA框架DLL動態(tài)庫讀取調(diào)用示例類
 *
 * @ClassName: DllCall
 * @Description: 讀取調(diào)用DLL動態(tài)庫文件中的方法
 * @author: zl
 * @date: 2020年05月26日 下午11:08:16
 */
public class JNADllCall {

    /**
     * DLL動態(tài)庫調(diào)用方法1
     *
     * @Description: 讀取調(diào)用StdCall方式導出的DLL動態(tài)庫方法
     * @author: zl
     * @date: 2020年05月26日 下午11:08:16
     */
    public interface StdCallDll extends StdCallLibrary {
        // DLL文件默認路徑為項目根目錄,若DLL文件存放在項目外,請使用絕對路徑
        StdCallDll INSTANCE = (StdCallDll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
                StdCallDll.class);// 加載動態(tài)庫文件
        // 聲明將要調(diào)用的DLL中的方法(可以是多個方法)

        void printf(String format, Object... args);
    }

    /**
     * DLL動態(tài)庫調(diào)用方法2
     *
     * @Description: 讀取調(diào)用Decl方式導出的DLL動態(tài)庫方法
     * @author: zl
     * @date: 2020年05月26日 下午11:08:16
     */
    public interface CLibrary extends Library {
        // DLL文件默認路徑為項目根目錄,若DLL文件存放在項目外,請使用絕對路徑
//        CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
//                CLibrary.class);
        // 下面目錄是我本地測試文件路徑
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary("C:\\Users\\zl\\Desktop\\Dll2_x64", CLibrary.class);

        // 聲明將要調(diào)用的DLL中的方法(可以是多個方法)
        int AddXY(int x, int y);
    }

    public static void main(String[] args) {
        int xy = CLibrary.INSTANCE.AddXY(2, 3);
        System.out.println(xy);
    }
}

以上簡單記錄java通過JNA框架調(diào)用DLL動態(tài)庫的步驟,若需要進一步了解可參考以下博文地址:http://www.itdecent.cn/p/ead89497c403

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容