天天看點

JNA之動态連結庫生成及調用詳解JAVA—C++(.dll)Windows版

JNA之動态連結庫生成及調用詳解JAVA—C++(.dll)Windows版

首先說下開發環境:VS2017+JDK1.8+JNA4.2+JAVA-IDE(eclipse)

需要Linux環境下的動态庫編譯可以點選這裡檢視

JNA(Java Native Access)是一個開源的Java架構,是Sun公司推出的一種調用本地方法的技術,是建立在經典的JNI基礎之上的一個架構。之是以說不使用JNI而選擇JNA,是因為JNA大大簡化了調用本地方法的過程,使用很友善,基本上不需要脫離Java環境就可以完成。

動态連結庫其實就是把調用的函數所在檔案子產品(DLL)和調用函數在檔案中的位置等資訊連結進目标程式,程式運作的時候再從DLL中尋找相應函數代碼,是以需要相應DLL檔案的支援。

由于項目是通過C++進行開發,需要通過代碼生成庫檔案供JAVA調用,故選擇工具JNA作為JAVA與C++之間的橋梁。

首先下載下傳JNA:點選下載下傳

進入後是github上的源碼下載下傳界面,如果需要下載下傳釋出版,進行如下操作

JNA之動态連結庫生成及調用詳解JAVA—C++(.dll)Windows版

點選後進去如下界面選擇你所有需要的版本進行下載下傳

注:windows平台下載下傳zip檔案 Linux平台下載下傳tar.gz檔案

JNA之動态連結庫生成及調用詳解JAVA—C++(.dll)Windows版

橋梁已經搭建好,接下來是需要c++的動态庫檔案了,生成步驟也是簡單

打開VS2017–檔案–建立項目–Visual C+±-windows桌面向導

JNA之動态連結庫生成及調用詳解JAVA—C++(.dll)Windows版

更改好項目名和存儲位置,以便後續查找!!!

在應用程式類型複選框中選擇動态庫連結庫(.dll),其他選項中選擇空項目

JNA之動态連結庫生成及調用詳解JAVA—C++(.dll)Windows版

之後生成一個空項目,在空項目中相應的部分添加.h頭檔案和.cpp源檔案

這裡我的項目名為hello,故頭檔案hello.h源檔案hello.cpp,當然檔案名不一定需要和項目同名

頭檔案中語句内容

#ifdef HELLO_API  
#else  
#define HELLO_API extern "C" __declspec(dllexport)  
#endif  

HELLO_API int add(int a, int b);
           

注意

extern “C”,此語句一定需要添加,不然你不知道它導出供我們使用的函數API是什麼,因為不加生成的API不是我們寫的API函數,後面會加一點符号,這個需要通過反編譯器檢視

具體參考部落格extern “C”

源檔案中語句内容

#include "hello.h"  

int add(int a, int b)
{
	return a + b;
}
           

最後生成解決方案

在對應的項目檔案夾下有如下檔案

JNA之動态連結庫生成及調用詳解JAVA—C++(.dll)Windows版
我這裡用的是release x64模式進行編譯在項目檔案的x64 release檔案中進行查找,找不到請對應自己的編譯模式進行查找

這就生成了我們所需要的動态連結庫.dll檔案,首先在VS上進行C++調用.dll實驗,如果連C++生成的動态庫自己都不能調用的話,那JAVA是肯定不行的。重新建立一個自己的項目檔案,在此之前需要把生成的.dll和.lib以及.h檔案添加到建立項目的目錄下,這樣才能保證項目能找到我們的動态庫,并自動連結上。

.h檔案在自己動态庫項目的檔案夾下

調用的項目代碼

#include "hello.h"
#define HELLO_API __declspec(dllimport)
#pragma comment(lib,"hello.lib") 

#include<iostream>
using namespace std;

int main()
{
	int max=add(3, 8);
	cout << "max=" << max << endl;
	return 0;
}
           

最後結果:

JNA之動态連結庫生成及調用詳解JAVA—C++(.dll)Windows版

成功!!!

接下來使用JNA實作JAVA的調用

首先本人使用的JAVA IDE是eclipse,進入軟體建立JAVA項目,調用之前需要将上文提到的JNA下載下傳下來後的jar包導入到自己的項目中

具體的導入方式網上例子很多就不再過多的叙述,留下一個關于eclipse導入包的連結

最後導入之後會有如下形式

JNA之動态連結庫生成及調用詳解JAVA—C++(.dll)Windows版

這個表示導入成功

然後是寫JAVA代碼進行C++的.dll調用了

調用代碼

package testJNA;
 
import java.util.Scanner;
import com.sun.jna.Native;
import com.sun.jna.Library;

public class HelloWord {
	public interface JNA extends Library{
		JNA INSTANCE=(JNA)Native.loadLibrary("HELLO",JNA.class);
		int add(int a,int b);
	}
	public static void main(String[] args) {
		int result=JNA.INSTANCE.add(5,13);
		System.out.println("result="+result);
	}
}
           
JNA之動态連結庫生成及調用詳解JAVA—C++(.dll)Windows版

成功!!!

現在可以去寫自己項目代碼的dll檔案了

繼續閱讀