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

Java Discussion :

Compiler des .class en code natif


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Par défaut Compiler des .class en code natif
    Je cherche le moyen de compiler des fichiers .class (contenant du byte code java).
    Le code ainsi obtenu doit encore pouvoir être chargé par la JVM.

    J'ai donc pensé a compilé mes classes en utilisant GCJ qui peut générer une librairie partagé (un fichier .so).

    Pour utilisé cette librairie, j'ai pensé charger cette librairie avec la méthode "System.loadLibrary" et pouvoir réécrire une implémentation de la classe en déclarant toutes les méthodes "native".

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Main {
    	static {
    		System.loadLibrary("helloworld");
    	}
    	public static void main(String[] args) throws Exception {
    		HelloWorld.sayHello();
    	}
    }
    La méthode HelloWorld.sayHello étant bien déclaré native.

    Le problème c'est que j'ai une erreur lors de l'execution
    [java] Exception in thread "main" java.lang.UnsatisfiedLinkError: sayHello
    [java] at HelloWorld.sayHello(Native Method)
    [java] at Main.main(Unknown Source)
    [java] Java Result: 1
    Si je comprend bien l'erreur, la JVM ne trouve pas la méthode native correspondante.

    Pour construire ma librairie partagé, j'ai créé une implémentation (non native) de la classe HelloWorld que j'ai ensuite compilé avec GCJ.
    Je suppose que la compilation GCJ n'est pas tout a fait correcte et que le résultat ne respecte pas les convention JNI.

    Première question : Est ce faisable ?
    Deuxième : Comment ? (je suppose qu'il manque quelque chose lors de la compimation avec GCJ mais je ne sais pas quoi).


    PS: Je suis prêt à compiler mon code avec autre chose que GCJ si besoin.

  2. #2
    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
    les classes compilées avec gcj s'utilisent comme toutes les autres classes. En fait, qu'elles soient compilées avec GCJ ou avec javac, elles devraient avoir le meme comportement. System.loadLibrary, c'est pour charger des librairies natives (genre du code C par exemple), pas pour charger des classes java compilées avec gcj. Pour les classes java, ca reste le principe du classpath et des import qui est à utiliser.

  3. #3
    Membre chevronné Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Par défaut
    Sauf que par défaut si on utilise GCJ pour générer des fichier .class (option -C), cela compile les classe sous forme de bytecode. J'aimerai pouvoir générer ces classes sous forme de code natif.
    Pour le reste je suis d'accord (sauf que du coup ca correspond pas a mon besoin)

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Mais... Du code natif ne peut être lié à du bytecode que par l'utilisation de JNI.

    Et Java, ironiquement, est totalement incapable de décrire des fonctions répondant aux conventions de liaison de JNI.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Mobius Voir le message
    J'aimerai pouvoir générer ces classes sous forme de code natif.
    Ce n'est pas possible ! Un fichier *.class ne peut pas être un fichier natif.

    Si tu produit du code natif avec GCJ, il faudra générer un exécutable natif pour pouvoir l'exécuter

    a++

  6. #6
    Membre chevronné Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Ce n'est pas possible ! Un fichier *.class ne peut pas être un fichier natif.
    D'ou l'idée de compilé mes classes en code natif dans une librairie externe et de faire le lien avec JNI.
    Mais cela semble difficilement faisable.
    La réponse de thelvin semble confirmer ma crainte.

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Pourquoi une telle obsession pour générer du code natif ???

    a++

  8. #8
    Invité
    Invité(e)
    Par défaut
    Par code natif, tu entends code machine ?
    Si oui, à mon avis, il n'y a pas d'autre moyen que de partir du code source d'une JVM opensource car c'est là que se situe le code natif de tout ce qui est lié au systèmes.

Discussions similaires

  1. compiler des classes qui en importe d'autre
    Par bogizo dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 28/08/2008, 03h25
  2. compilation des classe c++
    Par lobna dans le forum Windows
    Réponses: 2
    Dernier message: 17/05/2008, 11h07
  3. [Tomcat/Struts]non compilations des classes!
    Par jazer dans le forum Struts 1
    Réponses: 9
    Dernier message: 11/07/2006, 14h03
  4. [Débutant] J'ai un problème avec la compilation des classes
    Par Paulinho dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/11/2005, 14h23
  5. [javac] code pour lancer la compilation des classes
    Par viena dans le forum Général Java
    Réponses: 6
    Dernier message: 19/07/2004, 17h41

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