|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2001
Città: Casteddu
Messaggi: 532
|
[Java] Ibridare il java
Salve a tutti vorrei avere delle informazioni su come utilizzare
la java native interface avevo trovato una guida s mokabyte ma il mio piccolo programmino non funzionava potete aiutarmi??? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Spiegati meglio...
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2001
Città: Casteddu
Messaggi: 532
|
volevo creare un programma in java che si appoggiasse
al c attraverso l' uso di metodi nativi. non ho ben capito la procedura che devo esegure per scrivere il codice in c creare la dll e collegarla puoi aiutarmi? |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
scrivi la classe java dichiarando native i metodi che vuoi realizzare in C (o C++), lo compili, usi il programma javah per generare l'header e ne fai l'include nel tuo codice C. Compili il codice C realizzando una libreria condivisa e non un eseguibile e sei a posto. Ricordati il loadLibrary nel tuo codice java per caricarla |
|
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Sfruttare metodi nativi è di una semplicità esilarante. Provo a spiegarlo io, spero di esserne all'altezza.
Usiamo come ambiente di sviluppo C/C++ Dev-Cpp, così evito di dover spiegare cose che non conosco circa la costruzione di una libreria condivisa. Come esempio di applicazione che sfrutta un metodo nativo creeremo un fantastico programma che faccia la somma di due numeri interi usando una funzione C per la somma e Java per l'input-output. 1) Creiamo un sorgente "Glob.java" (il nome naturalmente non è importante). Codice:
class Glob { Ecco la dichiarazione di un metodo nativo: Codice:
public native int eseguiSomma(int numero1, int numero2); Ora carichiamo la libreria DLL (la chiamo dll perchè do per presupposto che si lavori in windows, ma non cambia un bel nulla su sistemi diversi a parte l'estensione). Codice:
static { System.loadLibrary("somma"); } ![]() Ora usiamo il metodo nativo. Dato l'obiettivo, il main è più che sufficiente. Codice:
public static void main(String[] args) { try { int n0=Integer.parseInt(a[0]); int n1=Integer.parseInt(a[1]); System.out.println(n0+" + "+n1+" = "+new Glob().eseguiSomma(n0,n1)); } catch(NumberFormatException e) { e.printStackTrace(); System.exit(0); } catch(ArrayIndexOutOfBoundsException e) { e.printStackTrace(); System.exit(0); } } Chiudiamo il corpo della classe con una parentesi graffa chiusa e siamo a posto. Di seguito il codice completo: Codice:
class Glob { public native int eseguiSomma(int numero1, int numero2); static { System.loadLibrary("somma"); } public static void main(String[] a) { try { int n0=Integer.parseInt(a[0]); int n1=Integer.parseInt(a[1]); System.out.println(n0+" + "+n1+" = "+new Glob().eseguiSomma(n0,n1)); } catch(NumberFormatException e) { } catch(ArrayIndexOutOfBoundsException e) { } } } Compila il sorgente (c:\glob> javac Glob.java). Ora creiamo l'header c che serve da "ponte" tra Java e la libreria dinamica. L'header (*.h) può essere creato automaticamente usando il tool "javah" contenuto nel JDK. Il comando è il seguente: c:\glob> javah Glob Nella cartella c:\glob dovresti avere adesso un file glob.h. Il file contiene il prototipo della funzione JNI corrispondente al metodo nativo "eseguiSomma". Quel prototipo deve essere implementato in un sorgente C e poi usato per costruire la libreria dinamica. E facciamolo. Apri Dev-Cpp. Crea un nuovo progetto "c" usando uno wizard "dll" e chiama il progetto "somma". Salva il progetto nella cartella "c:\glob" (per semplicità, la libreria può trovarsi in qualunque cartella del sistema operativo inclusa nella proprietà "java.library.path" o nella cartella del file .class). Dev-cpp crea 2 file sorgente "dllmain.c" e "dll.h". Non ci servono pertanto chiudili senza salvarli. Aggiungi un nuovo file sorgente al progetto (che salverai poi come "sommaImp.c" o con un altro nome, è irrilevante). Qui implementiamo il metodo nativo (nel nostro caso usando C, potrebbe essere Assembler o un altro linguaggio, "nativo" significa "non-java"). Il nostro metodo nativo è elementare: Codice:
#include <jni.h> #include "Glob.h" #include <stdio.h> JNIEXPORT jint JNICALL Java_Glob_eseguiSomma (JNIEnv *env, jobject obj, jint num1, jint num2) { return num1+num2; } Pima di compilare la nostra libreria occorre impostare i parametri del compilatore perchè trovi "jni.h". L'header "jni" si trova nel jdk, cartella "include". Con dev-cpp la cosa si risolve così: menu "strumenti"->"opzioni di compilazione". Nella finestra che compare seleziona la scheda "cartelle" quindi la scheda "include C". Sopra il bottone "cancella invalida" c'è un pulsante che permette di selezionare una cartella del sistema. Premilo e trova la cartella "c:\j2sdk1.4.2\include". Selezionala e poi premi "aggiungi". Fai lo stesso con la cartella "c:\j2sdk1.4.2\include\win32". La posizione della cartella può cambiare a seconda dell'installazione del JDK presente sul tuo sistema operativo. A questo punto non resta che lasciar compilare la libreria a Dev-cpp. Fatto questo troverai nella cartella "c:\glob" un file "somma.dll". E il gioco è fatto: C:\JP\glob>java Glob 10 20 10 + 20 = 30 C:\JP\glob> Dev-cpp lo trovi qui. Se ci sono problemi sai dove trovarci ![]() Ciao. Ultima modifica di PGI : 29-09-2003 alle 11:19. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2001
Città: Casteddu
Messaggi: 532
|
grazie a tutti avevo trovato un esmpietto su moka ma quando compilavo il codice in c mi diceva che non trovava le librerie standard del c!!!
ora provero grazie ancora!!!!!!!!!!!!!!!!! |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2001
Città: Casteddu
Messaggi: 532
|
17 D:\prova\c++\sommaImp.c:1
jni.h: No such file or directory. 2 D:\prova\c++\sommaImp.c In file included from sommaImp.c 17 D:\prova\c++\classenativa.h:2 jni.h: No such file or directory. 2 D:\prova\c++\sommaImp.c In file included from sommaImp.c 15 D:\prova\c++\classenativa.h parse error before `Java_classenativa_somma' 8 D:\prova\c++\sommaImp.c parse error before `Java_classenativa_somma' D:\prova\c++\Makefile.win [Build Error] [sommaImp.o] Error 1 quando compilo.... la dll mi da sti errori cosa sbaglio? |
![]() |
![]() |
![]() |
#8 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Mi sembra che il compilatore che stai usando non trovi il file di intestazione jni.h. Forse dovresti controllare le opzioni di compilazione per vedere se è stato inserita la cartella in cui si trova il file.
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Nov 2001
Città: Casteddu
Messaggi: 532
|
Quote:
la ho impostata nel profili di compilazione.... eppure mi dice che nn la trova che posso fare? |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Prova a includerla con
#include "/percorsocompletoheader/jni.h" anche se non e' la soluzione piu' elegante |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Nov 2001
Città: Casteddu
Messaggi: 532
|
Quote:
501 altri suggerimenti? |
|
![]() |
![]() |
![]() |
#12 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
A scanso di equivoci prova a cercare il file jni.h e vedere dov'è.
Lo dico perchè è incluso nel JDK ma non nel JRE e ci sono ambienti di sviluppo (tipo Eclipse) che funzionano anche senza un jdk. |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2001
Città: Casteddu
Messaggi: 532
|
stai nella cartella jbuilder9\jdk1.4\include
il compilatore c++ se ne sbatte però non le trova!!!! help my!!! |
![]() |
![]() |
![]() |
#14 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Azz. Che compilatore usi?
A mali estremi...prova a cambiarlo (in giro per il web ce ne sono a palate anche freeware tipo gnu-gcc) |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Nov 2001
Città: Casteddu
Messaggi: 532
|
uso quello consigliatomi qua!!!!!! il dev c++
non so + che pesci pigliare qualche suggerimento? |
![]() |
![]() |
![]() |
#16 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Questo è il contenuto della cartella "include C" che ho nelle opzioni ci compilazioni di dev-cpp
c:\Dev-cpp\include c:\j2sdk1.4.2\include c:\j2sdk1.4.2\win32 c:\j2sdk1.4.2\jre\bin\client Trova gli omologhi sul tuo sistema e includili. Ora prova ad aprire un nuovo progetto e scrivere questo in un nuovo file sorgente progetto -> nuovo -> cartella "basic" -> empy project Scegli come linguaggio "C" Poi: nuovo -> file sorgente -> aggiungi unità al progetto corrente "si" Codice:
#include "jni.h" int main() { return 0; } |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Nov 2001
Città: Casteddu
Messaggi: 532
|
no non funzia!! ora provo a scaricare e installare una jvm a parte magari è quella nel jburder che rompe le scatole.
|
![]() |
![]() |
![]() |
#18 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Mi stupirebbe perchè la compilazione del file C non coinvolge la jvm.
Quali sono gli errori che ti da compilando: Codice:
#include "jni.h" int main() { return 0; } |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Nov 2001
Città: Casteddu
Messaggi: 532
|
mi dice che non trova il file jni.h
|
![]() |
![]() |
![]() |
#20 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
in dev-cpp c'è una cartella (opzioni di compilazione) "include" sia per C che C++. Hai impostato per entrambi le directory? (in teoria non cambia nulla perchè stiamo usando C e per c l'hai già impostato ma tecnologia fa rima con magia...)
prova a cambiare (nel file "minimo" che stiamo provando) #include "jni.h" con #include "c:\j2sdk1.4.2....\jni.h" (cioè come segnalato da lovaz). In questo caso, se trova il file jni.h dovrebbe dirti che non trova il resto...forse |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:32.