IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

JNI, comment ça marche ?


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut JNI, comment ça marche ?
    Bonjour,

    j'ai quelques soucis dans l'utilisation de JNI, et les tutos que j'ai pu trouver pour l'instant ne m'ont pas paru très clairs.

    Je fais le portage de bibliothèques écrites pour Linux, intégrées à Eclipse sous forme d'un plugin.

    Je génère sans problème mes dll.
    J'arrive à les charger (avec System.load), mais dès que j'essaye d'appeler une fonction de ma dll, tout foire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    !ENTRY org.eclipse.osgi 4 0 2011-05-18 11:08:28.867
    !MESSAGE An error occurred while automatically activating bundle OTAWA (759).
    !STACK 0
    org.osgi.framework.BundleException: Exception in adtree.ADTREEPlugin.start() of bundle OTAWA.
    	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:806)
    	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:755)
    [.......]
    	at org.eclipse.equinox.launcher.Main.run(Main.java:1408)
    	at org.eclipse.equinox.launcher.Main.main(Main.java:1384)
    Caused by: java.lang.UnsatisfiedLinkError: ojawa.Otawa.idLABEL()J
    	at ojawa.Otawa.idLABEL(Native Method)
    	at ojawa.Otawa.<clinit>(Otawa.java:37)
    	at adtree.ADTREEPlugin.start(ADTREEPlugin.java:234)
    	at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:783)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:774)
    	... 74 more
    Root exception:
    java.lang.UnsatisfiedLinkError: ojawa.Otawa.idLABEL()J
    	at ojawa.Otawa.idLABEL(Native Method)
    	at ojawa.Otawa.<clinit>(Otawa.java:37)
    	at adtree.ADTREEPlugin.start(ADTREEPlugin.java:234)
    	at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:783)
    [.......]
    	at org.eclipse.equinox.launcher.Main.run(Main.java:1408)
    	at org.eclipse.equinox.launcher.Main.main(Main.java:1384)
    Par exemple sur le code java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String info = "OJAWA V" + ojawa.Otawa.version() + " (" + ojawa.Otawa.date() + ") found";
    déclaré ainsi dans ojawa.Otawa (public abstract Class):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static native String version();
    Pourquoi ?

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    As tu correctement nommé les méthodes dans ta lib ?
    Car avec JNI les méthodes sont nommées de la façon suivant :
    Java_<nom de la classe (avec package s'il y en a) >_<nom de la methode>

    Si tu ne respecte pas cette règle alors tu t'exposes a une exception java.lang.UnsatisfiedLinkError, ce qui semble être ton cas !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    Elle est déclarée comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /*
     * Class:     ojawa_Otawa
     * Method:    version
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_ojawa_Otawa_version
    (JNIEnv *env, jclass clazz) {
    	return env->NewStringUTF(VERSION);
    }
    Au passage, tout fonctionne très bien sous Linux (mais en invoquant des .so et pas des .dll).

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    d'après le message d'erreur ce n'est pas la méthode "version" qui pose problème mais "ojawa.Otawa.idLABEL()" !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    Elle est déclarée comme suit, mais au debogage, ça plante sur la ligne appelant version et date (en redécoupant la construction du String, ça coupe sur les deux, et pas juste un des deux).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /*
     * Class:     ojawa_Otawa
     * Method:    idLABEL
     * Signature: ()J
     */
    JNIEXPORT jlong JNICALL Java_ojawa_Otawa_idLABEL(
    	JNIEnv *env,
    	jclass clazz)
    {
    	return (jlong)&LABEL;
    }

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par ManusDei Voir le message
    mais au debogage, ça plante sur la ligne appelant version et date (en redécoupant la construction du String, ça coupe sur les deux, et pas juste un des deux).
    Non, le stacktrace mentionne bien que l'erreur a lieu sur l'initialisation statique de la classe, qui a lieu de manière automatique à la première utilisation de la classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	at ojawa.Otawa.idLABEL(Native Method)
    	at ojawa.Otawa.<clinit>(Otawa.java:37)
    Bref, regardez sur coté de Otawa.java:37

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ToAsciiEx, comment cela marche ?
    Par mikyfpc dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/02/2004, 21h39
  2. [MFC] list box : comment ça marche
    Par runn2 dans le forum MFC
    Réponses: 4
    Dernier message: 28/01/2004, 12h36
  3. [SYNEDIT] -> Comment ça marche ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 19h11
  4. [TP][Turbo Vision] comment ça marche ??
    Par Costello dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 05/08/2003, 00h24
  5. [update][req. imbriquee] Comment ca marche ??
    Par terziann dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2003, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo