jextract的使用

過移發表於2023-12-21

寫這個部落格的目的:新人去看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環境下跑一跑。
好,完結