Java Jni e MinGW

15 05 2008

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


Azioni

Informazione

Lascia un commento

Puoi usare questi tag : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>