AIUTO GraalVM: come richiamare le funzioni C in Java

27 views
Skip to first unread message

Francesco Zambon

unread,
Feb 5, 2023, 1:31:21 PM2/5/23
to JUG Padova
Ciao a tutti,

ho bisogno del vostro aiuto.

Sto cercando di richiamare i metodi della libreria open62541 scritta in C da un programma Java su Windows.

Open62541 è un implementazione open source del protocollo OPC UA.
https://www.open62541.org/


Vorrei ad esempio aprire una connessione verso il server e leggere una variabile:
https://github.com/open62541/open62541/blob/master/examples/tutorial_client_firststeps.c

utilizzando le API org.graalvm.nativeimage di GraalVM come descritto in questo articolo:
https://adambien.blog/roller/abien/entry/graalvm_how_to_call_c

Non sono ancora riuscito a creare il progetto Java.



Di seguito vi riporto i miei passi per ottenere il file open62541.c:

- Ho scaricato i sorgenti di open62541:
git clone https://github.com/open62541/open62541.git

- Ho installato Visual Studio Comunity 2022

- Ho installato l'ambiente di sviluppo C / C++

- Ho aggiunto il programma cmake alla variabile d'ambiente PATH:
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin

- Ho installato Python 3.11 (utilizzato dal progetto cmake di open62541)

Ho creato il progetto Visual Studio:
https://www.open62541.org/doc/0.3/building.html
mkdir build
cmake .. -DUA_ENABLE_AMALGAMATION=true

- Ho compilato da Visual Studio la solution build/open62541.sln per ottenere i seguenti file:
open62541.h
open62541.c



Da questo punto in poi ho preparato l'ambiente per GrallVM:

- Ho scaricato GraalVM Community Edition 22.3.1:
graalvm-ce-java11-windows-amd64-22.3.1.zip

- Ho installato i pacchetti:
graalvm-ce-java11-22.3.1\bin\gu install llvm
graalvm-ce-java11-22.3.1\bin\gu install llvm-toolchain
graalvm-ce-java11-22.3.1\bin\gu install native-image

- Ho compilato open62541.c con il seguente comando:
graalvm-ce-java11-22.3.1\lib\llvm\bin\clang -shared -o open62541.so open62541.c "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0\um\x64\WS2_32.lib" "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0\um\x64\iphlpapi.lib"

Ho dovuto aggiungere WS2_32.lib e iphlpapi.lib per riuscire a compilare.



A questo punto dovrei creare il progetto Java ed invocare i metodi della libreria open62541.so, ma non ho capito come utilizzare le API.

Ogni volta che richiamo un metodo ottengo:
Exception in thread "main" java.lang.UnsatisfiedLinkError ...



Stavo leggendo questo articoli:
https://stackoverflow.com/questions/62792151/java-call-c-library-using-native-image-from-graalvm
https://www.graalvm.org/sdk/javadoc/index.html?org/graalvm/nativeimage/c/package-summary.html
https://www.praj.in/posts/2020/opengl-demo-using-graalvm/

Ma sono molto confuso.



Vi ringrazio per l'aiuto.

Francesco.








Reply all
Reply to author
Forward
0 new messages