寫這個部落格的目的:新人去看jextract的官網是看不懂的,就算看懂了也不會使用,一頭霧水,我會從0開始教如何使用,如何搭配java去呼叫c函式。
首先我們得了解jextract是什麼,官網的解釋是一種從本機庫標頭檔案機械地生成 Java 繫結的工具。該工具利用 clang C API 來解析與給定本機庫關聯的標頭,生成的 Java 繫結基於 Foreign Function & Memory API。該工具最初是在 Project Panama 的背景下開發的(然後在 Project Panama Early Access 二進位制檔案中提供)。
官網連結:https://github.com/openjdk/jextract
為什麼會考慮到使用jextract呢?因為jni的那個太老而且操作太繁瑣了
接下來開始講解如何使用jextract
jextract-21的檔案的下載
jextract-21的windows版本的檔案下載連結:https://download.java.net/java/early_access/jextract/1/openjdk-21-jextract+1-2_windows-x64_bin.tar.gz
下載並解壓:
然後配置一下環境變數:
jextract的使用
先寫個.h的標頭檔案
程式碼:
//point.h
#include<stdio.h>
void sayHello();
然後再寫個.c的實現原始檔
#include "point.h"
void sayHello(){
printf("hello world");
}
接下來就是編譯連結成lib
gcc -c point.c
ar -cr pointlib.lib point.o
然後我們看一下jextract的使用說明書
可以看出--source是生成java資原始檔的
而-t是生成到某個目錄的名稱
比如說:
jextract --source -t org.jextract point.h
就是生成java原始碼並存放到本地目錄的org.jextract目錄下面
使用jextract
jextract --source -t org.jextract point.h
展示效果圖:
然後你執行是肯定必報錯的,因為沒有連結到lib裡面
真正使用jextract應該這樣使用
jextract --source -t 生成的包目錄 -l連結lib庫 檔案.h
這樣就連結到了。
不過我的建議是官網有一個這樣的例子:
https://github.com/openjdk/jextract/tree/master/samples/helloworld
兄弟們可以下載起來,然後在linux環境下跑一跑。
好,完結