Java Jni e MinGW

di Spinus

Per esigenze lavorative mi sono scontrato con Jni, che permette a codice Java di chiamare o di essere chiamato da applicazioni native (scritte in C o C++).
Il procedimento per scrivere una classe che utilizza metodi nativi è un po’ macchinoso, ma è abbastanza semplice:

  • si scrive una classe Java che contiene lo scheletro dei  metodi che dovranno essere eseguiti (questi metodi devono essere preceduti dalla keyword native)
  • si compila la classe:
    javac nomeclasse.java
  • si crea l’header che contiene i prototipi delle funzioni:
    javah -jni nomeclasse
  • si implementano i metodi (aggiungendo tutte le librerie necessarie)
  • si compila il file sorgente e si crea una dll:
    gcc -I"C:\Program Files\Java\jdk1.6.0_02\include" -I"C:\Program Files\Java\jdk1.6.0_02\include\win32" -c nome_scheletro_generato -o nome_file_dll.o
    gcc -shared -Wl,--kill-at -o nome_file_dll.dll nome_file_dll.o eventuale_file.lib
  • si importa la dll nella classe java e da quel momento i metodi potranno essere invocati come fossero metodi di una qualsiasi classe java:static
    System.loadLibrary ("nome_file_dll");

E MinGW cosa centra? Ho avuto un piccolo problema utilizzando MinGW, perché il loader di Java non ne voleva sapere di caricare la dll che avevo creato…dopo un po’ di hacking ho scoperto che MinGW usava un name mangling diverso da quello che si aspettava il loader, quindi ho dovuto aggiungere l’opzione -Wl,–kill-at (per una spiegazione più approfondita vedere i link in nota).

P.S. ho testato questa guida sotto Windows, ma con le opportune modifiche si può utilizzare anche sotto Linux, in questo caso, però, bisognerà controllare il metodo di chiamata di default di gcc (_stdcall)

Riferimenti :
http://www.javaworld.com/javaworld/javatips/jw-javatip23.html

http://www.willus.com/mingw/yongweiwu_stdcall.html

http://forum.java.sun.com/thread.jspa?threadID=5200233

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: