Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    92

    Errore di caricamento librerie native.

    Scusate ma mon riesco a capire se ho eseguito la procedura per scrivere metodi nativi bene.

    allora:

    mi pare di capire che si deve scrivere prima il metodo nativo non implementato in una qualsivoglia classe, aggiungendo uno statico con il system.loadlibrary per caricare poi all'atto dell'istanza la libreria contenente il metodo nativo, ad esempio:

    public class Classe
    {
    public int classe;

    public native int metodo(int classe);

    static {
    System.loadLibrary("metodo.a");
    }

    }

    poi tramite javah si crea l'header da includere nel progetto in C o C++, cosi' si può poi implementare il metodo in questione e creare la libreria(sia essa statica o dinamica).

    fatto questo non resta che scrivere una classe che istanzi la classe dove è dichiarato il metodo nativo ed usarlo:

    public class usaClasse
    {

    public static void main(String argv[])
    {
    Classe cls = new Classe();
    System.out.println(cls.metodo(3));
    }
    }

    Come mai al runtime mi dice:

    Exception in thread "main" java.lang.UnsatisfieldLinkErrror: no metodo.a in java.library.path

    sembra non carichi ( o linki bhò non ci capisco niente più la librerie esterna).

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Errore di caricamento librerie native.

    Originariamente inviato da salvio78
    mi pare di capire che si deve scrivere prima il metodo nativo non implementato in una qualsivoglia classe, aggiungendo uno statico con il system.loadlibrary per caricare poi all'atto dell'istanza la libreria contenente il metodo nativo
    Ok, corretto.

    Originariamente inviato da salvio78
    poi tramite javah si crea l'header da includere nel progetto in C o C++, cosi' si può poi implementare il metodo in questione e creare la libreria(sia essa statica o dinamica).
    Nooo! solo dinamica.

    Quindi il nome che passi alla loadLibrary è il nome della libreria senza estensione. Il nome fisico esatto della libreria dipende dal S.O. Se hai messo "mialibreria", su Windows dovrai avere una mialibreria.dll, su Linux una mialibreria.so

    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    92
    voglio chiedere un'altra cosa... ma

    static {
    System.loadLibrary("metodo.a");
    }

    non lo devo aggiungere alla classe dove metto il main?Oppure va scritto nella classe dove ottengo l'header?

    L'ho spostato subito prima del main, inoltre ho ricompilato con il dev creando una libreria dinamica (dll):

    #include "classe.h"

    int metodo(int a)
    {
    return a*a;
    }

    ma quando ho mandato a runtime mi da lo stesso errore.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da salvio78
    voglio chiedere un'altra cosa... ma

    static {
    System.loadLibrary("metodo.a");
    }

    non lo devo aggiungere alla classe dove metto il main?Oppure va scritto nella classe dove ottengo l'header?
    Lo si mette nella classe che contiene i metodi nativi!

    Originariamente inviato da salvio78
    L'ho spostato subito prima del main, inoltre ho ricompilato con il dev creando una libreria dinamica (dll):

    #include "classe.h"

    int metodo(int a)
    {
    return a*a;
    }

    ma quando ho mandato a runtime mi da lo stesso errore.
    Guarda che nel sorgente C/C++ la funzione deve avere il nome e il prototipo esattamente uguale a quanto indicato nell'header generato da javah!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    92
    E a te il nome e il prototipo non sembrano uguali?

    Ehi io in java non sono geniale ma in C non sbaglio un colpo e so bene che vuol dire nome e prototipo, se hai sollevato questa obiezione significa che se tu che non sai bene cosa dici.

    La classe e la libreria dichiarano lo stesso metodo e lo stesso prototipo, quindi se c'è qualche problema non è là.

    static {
    System.loadLibrary("metodo.a");
    }

    perchè lo si mette in quella classe?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da salvio78
    E a te il nome e il prototipo non sembrano uguali?
    Ok .... bisogna chiarire alcune cose ...

    Originariamente inviato da salvio78
    Ehi io in java non sono geniale ma in C non sbaglio un colpo e so bene che vuol dire nome e prototipo, se hai sollevato questa obiezione significa che se tu che non sai bene cosa dici.
    Prima di tutto sappi che ho alle spalle 2 corsi di specializzazione in cui ho studiato il "C" e 7 anni di esperienza professionale con il "C" .... quindi pensaci molto bene prima di dire ad altri che non sanno quello che dicono!

    Originariamente inviato da salvio78
    La classe e la libreria dichiarano lo stesso metodo e lo stesso prototipo, quindi se c'è qualche problema non è là.

    static {
    System.loadLibrary("metodo.a");
    }

    perchè lo si mette in quella classe?
    Veniamo alla questione tecnica.
    Io ho preso la tua classe (quella che hai messo nel primo post):
    codice:
    public class Classe
    {
        public int classe;
    
        public native int metodo(int classe);
    
        static {
            System.loadLibrary("metodo.a");
        }
    }
    L'ho compilata ed ho ottenuto con javah l'header da includere.
    Il prototipo generato è:

    JNIEXPORT jint JNICALL Java_Classe_metodo (JNIEnv *, jobject, jint);

    Ti pare che sia uguale al tuo:

    int metodo(int a);

    ????


    Quindi nel tuo programma C/C++ devi mettere:

    codice:
    JNIEXPORT jint JNICALL Java_Classe_metodo (JNIEnv *env, jobject obj, jint value)
    {
        ....
        ....
    }
    All clear???
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ah ..... e se ti stai chiedendo cosa siano JNIEXPORT, JNIEnv, jobject, ecc.... allora forse (ma proprio forse ) è meglio se ti leggi:

    Java Native Interface: Programmer's Guide and Specification

    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    92
    Ti ringrazio per il link, ma avevo trovato la documentazione è così che ho capito cosa toppavo, cmq spero che il post possa aiutare.

    Mi spiace non avevo letto questa frase:
    "Guarda che nel sorgente C/C++ la funzione deve avere il nome e il prototipo esattamente uguale a quanto indicato nell'header generato da javah!!"

    Appunto grazie alla documentazione ho capito quelle variabili cosa volessero dire.

    Grazie lo stesso!

    PS:effettivamente devo prendere il vizio di leggere le documentazioni prima di postare...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.