PDA

Visualizza la versione completa : Metodi nativi in Eclipse, da C a JAVA


 
peruzzo
20-01-2013, 18:13
Oggi sono alle prese con i metodi nativi ed il manuale mi propone i seguenti codici e spiega come usarli ma non si sofferma sull'utilizzo di Eclipse e di altri eventuali programmi per la creazione dei singoli file di interscambio. Qualcuno mi può aiutare specificando per filo e per segno le operazioni da compiersi?

listing A


// A simple example that uses a native method.
public class NativeDemo {
int i;
public static void main(String args[]) {
NativeDemo ob = new NativeDemo();
ob.i = 10;
System.out.println("This is ob.i before the native method:" +
ob.i);
ob.test(); // call a native method
System.out.println("This is ob.i after the native method:" +
ob.i);
}
// declare native method
public native void test() ;
// load DLL that contains static method
static {
System.loadLibrary("NativeDemo");
}
}

listing B


/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativeDemo */

#ifndef _Included_NativeDemo
#define _Included_NativeDemo
#ifdef _ _cplusplus
extern "C" {
#endif
/*
* Class: NativeDemo
* Method: test
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_NativeDemo_test
(JNIEnv *, jobject);

#ifdef _ _cplusplus
}
#endif
#endif

listing C


/* This file contains the C version of the
test() method.
*/

#include <jni.h>
#include "NativeDemo.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_NativeDemo_test(JNIEnv *env, jobject obj)
{
jclass cls;
jfieldID fid;
jint i;

printf("Starting the native method.\n");
cls = (*env)->GetObjectClass(env, obj);
fid = (*env)->GetFieldID(env, cls, "i", "I");

if(fid == 0) {
printf("Could not get field id.\n");
return;
}

i = (*env)->GetIntField(env, obj, fid);
printf("i = %d\n", i);
(*env)->SetIntField(env, obj, fid, 2*i);
printf("Ending the native method.\n");
}

Sul manuale c'è scritto che prima di tutto bisogna creare NativeDemo.h usando il codice javah -jni NativeDemo e caricarlo con il C ma se scrivo il listato A in Eclipse ottengo il seguente errore:


Exception in thread "main" java.lang.UnsatisfiedLinkError: no NativeDemo in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at NativeDemo.<clinit>(NativeDemo.java:17)


:dhò: :dhò: :dhò:

Mai più un testo di Herbert Schildt... :jam:

Alex'87
21-01-2013, 10:16
A meno che tu non abbia assolutamente bisogno di usare metodi nativi lascia perdere...

Ad ogni modo, hai ottenuto la dll? Dove l'hai messa? A cosa punta il tuo java.library.path?

peruzzo
21-01-2013, 12:06
Originariamente inviato da Alex'87
A meno che tu non abbia assolutamente bisogno di usare metodi nativi lascia perdere...

Ad ogni modo, hai ottenuto la dll? Dove l'hai messa? A cosa punta il tuo java.library.path?

No, non sono riuscito ad ottenere la dll e non so a cosa punta il mio java.library.path. :(

Praticamente il manuale mi propone il primo codice (public class NativeDemo...) poi mi consiglia di creare con java e quindi nel mio caso con Eclipse un file di nome NativeDemo.h che servirà, se ho capito bene a generare una DLL con VisualStudio. Per creare questo file .h bisogna usare la dicitura javah -jni NativeDemo che non funziona come tutte le diciture presenti nel libro... :(

Alex'87
21-01-2013, 12:14
Originariamente inviato da peruzzo
No, non sono riuscito ad ottenere la dll e non so a cosa punta il mio java.library.path. :(


Senza la dll posizionata nel java.library.path il programma non potrà funzionare ovviamente...


Originariamente inviato da peruzzo
Praticamente il manuale mi propone il primo codice (public class NativeDemo...) poi mi consiglia di creare con java e quindi nel mio caso con Eclipse un file di nome NativeDemo.h che servirà, se ho capito bene a generare una DLL con VisualStudio. Per creare questo file .h bisogna usare la dicitura javah -jni NativeDemo che non funziona come tutte le diciture presenti nel libro... :(

Ripeto, lascia perdere jni per il momento: a meno che tu non abbia intenzione di usarlo pesantemente è una perdita di tempo...

peruzzo
21-01-2013, 12:35
Mi potrebbe servire, voglio leggere tutto il manuale, non solo alcune parti. Ho trovato su youtube una guida e ho provato a seguirla pedestremente. L'utente scrive proprio javah -jni nomedellaclasse come c'è sul mio libro e ottiene questo benedetto file.h. Perché solo a me non funziona?

Guarda qui:

http://www.youtube.com/watch?v=Ki04XdNsNZY

non mi funziona neanche javac... guarda verso 5:40... è quella la parte che non mi funziona...

:dhò:

Alex'87
21-01-2013, 12:43
Lo so che "javah -jni NativeDemo" funziona, ho usato ancora jni...

Che errore ottieni quando scrivi sulla console javah -jni NativeDemo?

peruzzo
21-01-2013, 12:46
"javah" non è riconosciuto come comando interno o esterno,
un programma eseguibile o un file batch

ovviamente non mi dispiacerebbe capire come creare il .h anche direttamenye da Eclipse sempre che sia possibile...

Alex'87
21-01-2013, 13:14
Originariamente inviato da peruzzo
"javah" non è riconosciuto come comando interno o esterno,
un programma eseguibile o un file batch

E cosa aspetti a dirlo? :stordita:
Aggiungi alla variabile d'ambiente PATH il percorso in cui si trova l'sdk (cerca nel forum, se ne è parlato un sacco di volte)



Originariamente inviato da peruzzo
ovviamente non mi dispiacerebbe capire come creare il .h anche direttamenye da Eclipse sempre che sia possibile... Forse esiste qualche plugin, non saprei.

peruzzo
21-01-2013, 13:40
non capisco il consiglio... come si aggiunge ad una variabile d'ambiente un path?

Alex'87
21-01-2013, 14:02
Originariamente inviato da peruzzo
non capisco il consiglio... come si aggiunge ad una variabile d'ambiente un path?

Attraverso il prompt dei comandi oppure da Risorse del computer->tasto destro->proprietà

http://stackoverflow.com/questions/2079635/how-can-i-set-the-path-variable-for-javac-so-i-can-manually-compile-my-java-wor

Loading