Utilisation de JNI

Fermé
supergaga1712 Messages postés 5 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 24 avril 2008 - 23 avril 2008 à 16:46
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 - 24 avril 2008 à 15:14
Bonjour à tous,

Je travaille actuellement sur une interface
graphique en Java, pour un logiciel codé en C. La partie interface
graphique fonctionne, je désire maintenant faire " communiquer"
l'interface en Java avec du code source en C. Pour le moment, je veux
juste récupérer du texte dans un panneau d'une JFrame pour pouvoir
l'afficher, avec un printf par exemple, ou alors l'afficher dans un
autre panneau de l'interface. Le but est donc d'appeler, grâce au C,
une méthode Java, comme getText par exemple.

J'ai bien suivi
la procédure de JNi, pour les ocmpilations, les entêtes, j'ai généré le
DLL, et fait tourner le fichier java avec un System.LoadLibrary...mais
je tombe sur cette erreur :

"java.lang.NoSuchMethodError: main
Exception in thread "main" "

Quelqu'un aurait il une explication à me fournir, voire des indications sur quelque chose que j'aurais laissé filer ?

Merci d'avance pour la réponse.

Je joins mon code Java ainsi que mon code C :

Code java : désolé pour la longueur, la partie intéressante ( déclaration de méthode native) est à la fin.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class TrySplit implements ActionListener  {
 
  public JTextArea ta2;
  public JTextArea ta3;
  public JTextArea ta1;
  public JTextArea ta4;
  public String s;
  JMenuItem itm;
  JMenuItem ito;
  JMenuItem itI;
  JMenuItem itM;
  JFrame f ;
 
  TrySplit () {
 
    //---- creation fenetre
    f = new JFrame ("Sirena");
   
    f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
   
    //----création 4 JFrame
     JFrame p1 = new  JFrame ();
     JFrame p2 = new  JFrame ();
     JFrame p3 = new  JFrame ();
     JFrame p4 = new  JFrame ();
    //----création 4 Jlabel
    JLabel l1 = new JLabel ("Signaux");
    JLabel l2 = new JLabel ("Transferts");
    JLabel l3 = new JLabel ("Equations");
    JLabel l4 = new JLabel ("Résultats");
    //---- on choppe le conteneur des panels
   Container c1 = p1.getContentPane();
   Container c2 = p2.getContentPane();
   Container c3 = p3.getContentPane();
   Container c4 = p4.getContentPane();
   c1.setLayout (new BorderLayout ());
   c2.setLayout (new BorderLayout ());
   c3.setLayout (new BorderLayout ());
   c4.setLayout (new BorderLayout ());
   
    //---- creation 4 JTextArea
    ta1 = new JTextArea ();
      
    ta2 = new JTextArea ();
   
    ta3 = new JTextArea ();
   
   
    ta4 = new JTextArea();
    //---- on place les textarea et les labels correspondants dans les flowlayout
    c1.add(l1,BorderLayout.NORTH);
    c1.add(ta1);
   
     c2.add(l2,BorderLayout.NORTH);
    c2.add(ta2);
     c3.add(l3,BorderLayout.NORTH);
    c3.add(ta3);
     c4.add(l4,BorderLayout.NORTH);
    c4.add(ta4);
    //---- placées dans des JScrollPane's pour ascenseurs
    JScrollPane scrp1 = new JScrollPane (c1);
    Dimension d = new Dimension (300, 150);
    scrp1.setPreferredSize (d);
   
    JScrollPane scrp2 = new JScrollPane (c2);
    //Dimension d = new Dimension (300, 100);
    scrp2.setPreferredSize (d);
    JScrollPane scrp3 = new JScrollPane (c3);
   
  
    JScrollPane scrp4 = new JScrollPane (c4);
    //---- scrp1+scrp2-> JSplitPane verticale
    JSplitPane splp1 = new JSplitPane (JSplitPane.VERTICAL_SPLIT, scrp1, scrp2);
    //---- splp1 + scrp3 -> JSplitPane horizontale
    JSplitPane splp2 = new JSplitPane (JSplitPane.HORIZONTAL_SPLIT, splp1, scrp3);
    JSplitPane splp3 = new JSplitPane (JSplitPane.VERTICAL_SPLIT, splp2, scrp4);
    //---- splp2 --> fenetre et on affiche !
    f.getContentPane ().add (splp3);
    f.pack ();
    f.setVisible (true);   
       
       
   
    JMenuBar mb = new JMenuBar ();//création du menu

   
    JMenu m = new JMenu ("Fichier");//création élément de menu
    JMenuItem it = new JMenuItem ("Dossier précédent");
    it.addActionListener (this);
    m.add (it);
    it.setVisible(false);
   //JCheckBoxMenuItem itn = new JCheckBoxMenuItem ("pouet");
    //itn.addActionListener (this);
     //m.add (itn);
    ito = new JMenuItem ("ouvrir");
    ito.addActionListener (this);
    m.add (ito);
    JMenuItem ite = new JMenuItem ("Enregistrer");
    ite.addActionListener (this);
    m.add (ite);
    JMenuItem ites = new JMenuItem ("Enregistrer sous");
    ites.addActionListener (this);
    m.add (ites);
    JMenuItem itf = new JMenuItem ("Fermer");
    itf.addActionListener (this);
    m.add (itf);
    JMenuItem iti = new JMenuItem ("Imprimer");
    iti.addActionListener (this);
    m.add (iti);
    JMenuItem itc = new JMenuItem ("Configurer l'imprimante");
    itc.addActionListener (this);
    m.add (itc);
    JMenuItem itq = new JMenuItem ("Quitter");
    itq.addActionListener (this);
    m.add (itq);
  
    mb.add (m);
   
    JMenu m1 = new JMenu ("Edition");//création élément de menu
    JMenuItem it1 = new JMenuItem ("Annuler");
    it1.addActionListener (this);
    m1.add (it1);
    JMenuItem itcou = new JMenuItem ("Couper");
    itcou.addActionListener (this);
    m1.add (itcou);
    JMenuItem itcop = new JMenuItem ("Copier");
    itcop.addActionListener (this);
    m1.add (itcop);
    JMenuItem itcol = new JMenuItem ("Coller");
    itcol.addActionListener (this);
    m1.add (itcol);
    JMenuItem its = new JMenuItem ("Seletionner tout");
    its.addActionListener (this);
    m1.add (its);
    //it1 = new JCheckBoxMenuItem ("pouet");
    //it1.addActionListener (this);
    //m1.add (it1);
   
   
    mb.add (m1);
       
    JMenu m2 = new JMenu ("Système");//création élément de menu
    JMenuItem it2 = new JMenuItem ("Valider les équations");
    it2.addActionListener (this);
    m2.add (it2);
    //it2 = new JCheckBoxMenuItem ("pouet");
    //it2.addActionListener (this);
    //m2.add (it2);
    JMenuItem ita = new JMenuItem ("Afficher les équations");
    ita.addActionListener (this);
    m2.add (ita);
    itm = new JMenuItem ("Modifier un transfert");
    itm.addActionListener (this);
    m2.add (itm);
    itI = new JMenuItem ("Initialiser les transferts");
    itI.addActionListener (this);
    m2.add (itI);
    JMenuItem itA = new JMenuItem ("Afficher les transferts");
    itA.addActionListener (this);
    m2.add (itA);
    itM = new JMenuItem ("Modifier un signal");
    itM.addActionListener (this);
    m2.add (itM);
    JMenuItem itS = new JMenuItem ("Supprimer un signal");
    itS.addActionListener (this);
    m2.add (itS);
    JMenuItem itaff = new JMenuItem ("Afficher les signaux");
    itaff.addActionListener (this);
    m2.add (itaff);
    JMenuItem itsau = new JMenuItem ("Sauver résultats");
    itsau.addActionListener (this);
    m2.add (itsau);
    JMenuItem itv = new JMenuItem ("Vider résultats");
    itv.addActionListener (this);
    m2.add (itv);
   
   
    mb.add(m2);
  
     JMenu m3 = new JMenu ("Analyse");//création élément de menu
    JMenuItem it3 = new JMenuItem ("ouvrir");
    it3.addActionListener (this);
    m3.add (it3);
    //it3 = new JCheckBoxMenuItem ("pouet");
    //it3.addActionListener (this);
    //m3.add (it3);
    mb.add(m3);
   
     JMenu m4 = new JMenu ("Réponse");//création élément de menu
    JMenuItem it4 = new JMenuItem ("ouvrir");
    it4.addActionListener (this);
    m4.add (it4);
    it4 = new JCheckBoxMenuItem ("pouet");
    it4.addActionListener (this);
    m4.add (it);
    mb.add(m4);
 
     JMenu m5 = new JMenu ("Réglage");//création élément de menu
    JMenuItem it5 = new JMenuItem ("ouvrir");
    it5.addActionListener (this);
    m5.add (it5);
    it5 = new JCheckBoxMenuItem ("pouet");
    it5.addActionListener (this);
    m5.add (it);
    mb.add(m5);
   
     JMenu m6 = new JMenu ("Identification");//création élément de menu
    JMenuItem it6 = new JMenuItem ("ouvrir");
    it6.addActionListener (this);
    m6.add (it6);
    it6 = new JCheckBoxMenuItem ("pouet");
    it6.addActionListener (this);
    m6.add (it);
    mb.add(m6);
   
     JMenu m7 = new JMenu ("Trait. Signal");//création élément de menu
    JMenuItem it7 = new JMenuItem ("ouvrir");
    it7.addActionListener (this);
    m7.add (it7);
    it7 = new JCheckBoxMenuItem ("pouet");
    it7.addActionListener (this);
    m7.add (it);
    mb.add(m7);
   
     JMenu m8 = new JMenu ("Fenêtre");//création élément de menu
    JMenuItem it8 = new JMenuItem ("ouvrir");
    it8.addActionListener (this);
    m8.add (it8);
    it8 = new JCheckBoxMenuItem ("toto");
    it8.addActionListener (this);
    m8.add (it);
    mb.add(m8);
   
     JMenu m9 = new JMenu ("Option");//création élément de menu
    JMenuItem it9 = new JMenuItem ("ouvrir");
    it9.addActionListener (this);
    m9.add (it9);
    it9 = new JCheckBoxMenuItem ("pouet");
    it9.addActionListener (this);
    m9.add (it);
    mb.add(m9);
   
     JMenu m0 = new JMenu ("Aide");//création élément de menu
    JMenuItem it0 = new JMenuItem ("ouvrir");
    it0.addActionListener (this);
    m0.add (it0);
    it0 = new JCheckBoxMenuItem ("pouet");
    it0.addActionListener (this);
    m0.add (it);
    mb.add(m0);
   
   
    f.setJMenuBar (mb);
    f.setSize (new Dimension (800, 600));
    f.setVisible (true);
   
           
   }//fin constructeur
  
    // écouter les évenements
     public void actionPerformed (ActionEvent ev)
    {
        if(ev.getSource()==itm)
        {
         System.out.println("acion sur bouton");
         Transmittance box = new Transmittance();
         box.setVisible(true);
         f.setVisible(false);
        }
       
         if (ev.getSource()==itM)
        {
         modifi_signal sig = new modifi_signal();
         f.setVisible(false);
         f.setVisible(true);
         sig.setVisible(true);
        }
       
         if (ev.getSource()==ito)
        {
         ouvrir_dossier ouv = new ouvrir_dossier();
         f.setVisible(false);
         f.setVisible(true);
         ouv.setVisible(true);
       }
  
    }
   
    public class UseObjects {
  private native void changeObject(TrySplit pouet);

   {
System.loadLibrary("UseObjImpl");
   // Astuce Linux, si vous ne pouvez pas
   // positionner le chemin des bibliothèques
   // dans votre environnement :
   // System.load(
   //"/home/bruce/tij2/appendixb/UseObjImpl.so");
}
 
} ///:~
 
  public  void main(String[] args) {
   
   TrySplit gaga=new TrySplit();
   UseObjects app = new UseObjects();
   app.changeObject(gaga);
  }
 
}

Voici le code C :
#include <jni.h>
#include "TrySplit_UseObjects.h"
extern "C" JNIEXPORT void JNICALL
Java_UseObjects_changeObject(JNIEnv* env, jobject, jobject pouet) {
jclass cls = env->GetObjectClass(pouet);
jmethodID mid = env->GetMethodID(cls, "getText", "()V");
  char value = env->GetCharField(pouet, fid);
printf("Native: %d\n", value);
env->CallVoidMethod(pouet, mid);
value = env->GetCharField(pouet, fid);
printf("Native: %d\n", value);
} ///:~

Merci d'avance.

8 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 avril 2008 à 17:36
Salut,

ton main java n'est pas valide... c'est pas :
public  void main(String[] args) {
mais
public static void main(String[] args) {

autre chose :

1 - Ne fait JAMAIS plusieurs fois System.loadLibrary("UseObjImpl"); sinon tu risques de charger plusieurs fois ta lib...et c'est pas bien... le mieux serait de mettre le chargement dans le constructeur static de ta classe exemple :
public class UseObjects {

  static {
    System.loadLibrary("UseObjImpl");
  }

  private native void changeObject(TrySplit pouet);
}

2 - Tu mets en commentaire :
// Astuce Linux, si vous ne pouvez pas positionner le chemin des bibliothèques dans votre environnement :
hors ce n'est pas valable QUE pour unix mais TOUS les OS de plus si tu dois forcer le chemin de la lib ne fait pas de System.load(xxx) mais utilise l'option -Djava.library.path=lib/path de l'utilitaire 'java'

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
supergaga1712 Messages postés 5 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 24 avril 2008
23 avril 2008 à 23:01
Bonsoir,

Merci pour la réponse,

Concernant le main, si je laisse le static, j'ai un problème concernant la déclaration d'une variable, et ca ne compile pas.

Auriez vous des idées concernant l'erreur que je génère (celle décrite dans le premier post), ou sur le code C pour effectuer l'action désirée?

Merci d'avance
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 avril 2008 à 23:49
Salut,

soit tu changes la déclaration de ta classe UseObjects :
faut la mettre static (public static class UseObjects)

soit tu changes ton algo :
exemple de solution plus propre serait de mettre la classe UseObjects dans un nouveau fichier

dans tous les cas tu n'as pas le choix en java le main doit être static...

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
supergaga1712 Messages postés 5 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 24 avril 2008
24 avril 2008 à 00:39
Problème résolu pour le static, merci beaucoup.

Des idées sur le reste?

bonne nuit  et encore merci !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
24 avril 2008 à 00:43
Salut,

c'est quoi le reste ?

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
supergaga1712 Messages postés 5 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 24 avril 2008
24 avril 2008 à 13:29
Bonjour,

"java.lang.NoSuchMethodError: main
Exception in thread "main" "

C'est cette exception.

Par ailleurs, si quelqu'un s'y connaît en JNI, ou connaît quelqu'un qui est calé, je prends :)

C'est surtout le code C qui me pose problème à vrai dire.

Merci d'avance pour la réponse,

Bonne journée
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
24 avril 2008 à 15:11
Salut,

>"java.lang.NoSuchMethodError: main
>Exception in thread "main" "
>
>C'est cette exception.
Bah je t'ai répondu...

>Par ailleurs, si quelqu'un s'y connaît en JNI, ou connaît quelqu'un qui est calé, je prends :)
C'est cool ça fait plaisir... tellement que je quite ce sujet et te souhaite bonne demerde dans ta recherche de developpeur JNI...

>C'est surtout le code C qui me pose problème à vrai dire.
Absolument rien à voir avec ton erreur..................

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
24 avril 2008 à 15:14
je clos

si tu n'accepte pas l'aide de l'un de ceux qui est le plus cale en JNI du forum pas de raison que tu acceptes celle des autres

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
Rejoignez-nous