1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juin 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : juin 2018
    Messages : 10
    Points : 7
    Points
    7

    Par défaut JNI creation JFrame sur MacOS

    Bonjour,

    Bonjour,

    Mon but est de créer une Frame en utilisant JNI. Cela fonctionne quand j'utilise un code simple et que je le compile tout seul. Par contre cela ne fonctionne pas quand je l'intègre à mon projet global.

    le code simple cpp:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    // Example 2 of JNI invocation.  
    // The java environment is prepared.  Errors are reported. 
    // Call to a simple static java methods 
    // License: ZLIB license (see license.txt)
    // (c) Copyright 2015 by cth027
     
    #include <iostream>
    #include <jni.h>
    #include <objc/objc-runtime.h>
     
    void runCocoaMain(void)
    {
        id clazz = (id) objc_getClass("NSApplication");
        id _Nullable app = objc_msgSend(clazz, sel_registerName("sharedApplication"));
     
        objc_msgSend(app, sel_registerName("run"));
    }
     
     
    int main()
    {
    	using namespace std;
     
        JavaVM *jvm;				// Pointer to the JVM (Java Virtual Machine)
    	JNIEnv *env;				// Pointer to native interface
     
    	//==================== prepare loading of Java VM ============================
     
    	JavaVMInitArgs vm_args;                        // Initialization arguments
    	JavaVMOption* options = new JavaVMOption[1];   // JVM invocation options
    	options[0].optionString = "-Djava.class.path=.";   // where to find java .class
    	vm_args.version = JNI_VERSION_1_8;             // minimum Java version
    	vm_args.nOptions = 1;                          // number of options
    	vm_args.options = options;
    	vm_args.ignoreUnrecognized = JNI_TRUE;     // invalid options make the JVM init fail
     
    	//================= load and initialize Java VM and JNI interface ===============
     
    	jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);  // YES !!
    	delete options;    // we then no longer need the initialisation options. 
     
    	//========================= analyse errors if any  ==============================
    	// if process interuped before error is returned, it's because jvm.dll can't be 
    	// found, i.e.  its directory is not in the PATH. 
    if (rc == JNI_ERR) {
        printf("All done, bye bye!\n");
    }
    	if(rc != JNI_OK) {
    		if(rc == JNI_EVERSION)
    			cerr << "FATAL ERROR: JVM is oudated and doesn't meet requirements" << endl;
    		else if(rc == JNI_ENOMEM)
    			cerr << "FATAL ERROR: not enough memory for JVM" << endl;
    		else if(rc == JNI_EINVAL)
    			cerr << "FATAL ERROR: invalid ragument for launching JVM" << endl;
    		else if(rc == JNI_EEXIST)
    			cerr << "FATAL ERROR: the process can only launch one JVM an not more" << endl;
    		else
    			cerr << "FATAL ERROR:  could not create the JVM instance (error code " << rc << ")" << endl;
    		cin.get();
    		exit(EXIT_FAILURE);
    	}
     
    	cout << "JVM load succeeded. \nVersion ";
    	jint ver = env->GetVersion();
    	cout << ((ver >> 16) & 0x0f) << "." << (ver & 0x0f) << endl;
     
    	// First call to JAVA ==================================================================
    	jclass cls2 = env->FindClass("MyTest2");  // try to find the class 
    	if(cls2 == nullptr) {
    		cerr << "ERROR: class not found !";
    	}
    	else {                                  // if class found, continue
    		cout << "Class MyTest found" << endl;
                 //       runCocoaMain();
    		jmethodID mid = env->GetStaticMethodID(cls2, "run", "()V");  // find method
    		if(mid == nullptr)
    			cerr << "ERROR: method void mymain() not found !" << endl;
    		else {
    			cout << "===Call to java==================" << endl; 
     
                env->CallStaticVoidMethod(cls2, mid);                      // call method
                runCocoaMain();
    			cout << "===End of call to java==========="<<endl;
    		}
    	}
    	// End JAVA calls ==================================================================
     
     
    	jvm->DestroyJavaVM();
     
    	cout << "Press any key...";
    	cin.get();
    }
    Code Java :
    Code java : 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    // MyTest.java test class for JNI experimentation 
    // example 2
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.SwingUtilities;
     
    public class MyTest2 {
     
        public static class Starter implements Runnable {
            public void run() {
                System.out.println("Runnning on AWT Queue.");
     
                JFrame.setDefaultLookAndFeelDecorated(true);
                JFrame frame = new JFrame("That's a frame!");
                frame.setSize(400, 200);
                JLabel label = new JLabel("A Label");
                frame.getContentPane().add(label);
                frame.setLocationRelativeTo(null);
                //Termine le processus lorsqu'on clique sur la croix rouge
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                //frame.pack();
                frame.setVisible(true);
     
                //JButton button;
                //JPanel panel;
     
                // my error lines are under the "panel" and  "button"
                // it says i must implement the variables. what does that mean???
                //panel.add(button);
            }
        }
     
        public static class GUI implements Runnable {
            public void run() {
                try {
                    System.out.println("Going to put something on the AWT queue.");
                    SwingUtilities.invokeAndWait(new Starter());
                    System.out.println("2.");
                } catch (Exception exc) {
                    throw new RuntimeException(exc);
                }
            }
        }
     
        public static void run() {
            Thread gui = new Thread(new GUI());
            gui.start();
        }
    }

    La fonction RunCocoaMain() me permet de faire fonctionner la JFrame comme expliqué dans ce forum (https://stackoverflow.com/questions/...ing-jni-from-c). Cela fonctionne parfaitement tout seul par contre lorsque j'insère le code dans mon projet global, j'ai une erreur pendant l'exécution dans la fonction RunCocoaMain() au niveau de la ligne "id _Nullable app = objc_msgSend(clazz, sel_registerName("sharedApplication"));"

    Erreur :
    A fatal error has been detected by the Java Runtime Environment:
    SIGSEGV (0xb) at pc=0x00007fff5f159165, pid=4917, tid=0x0000000000000307
    JRE version: Java(TM) SE Runtime Environment (8.0_172-b11) (build 1.8.0_172-b11)
    Java VM: Java HotSpot(TM) 64-Bit Server VM (25.172-b11 mixed mode bsd-amd64 compressed oops)
    Problematic frame:
    C [SkyLight+0x20a165] _ZN12_GLOBAL__N_112get_registryEv.8847+0x33
    Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
    An error report file with more information is saved as:
    /Users/.../Desktop/projet/total_test/hs_err_pid4917.log
    If you would like to submit a bug report, please visit:
    http://bugreport.java.com/bugreport/crash.jsp
    The crash happened outside the Java Virtual Machine in native code.
    See problematic frame for where to report the bug.
    Le fichier hs_err_pid4917.log est en PJ

    Mes questions sont les suivantes :
    _ Etant novice dans l'interprétation du fichier .log, quelqu'un pourrai m'indiquer un auto ou alors me dire ce qu'il indique comme problème ?
    _D'où vient le fait que le code fonctionne tout seul mais pas quand je l'insère dans mon projet global ?


    Merci d'avance
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Très débutant en C sur Macos X
    Par clampin dans le forum C
    Réponses: 2
    Dernier message: 27/04/2006, 12h13
  2. creation vue sur une periode
    Par LHERMITTE dans le forum Oracle
    Réponses: 2
    Dernier message: 30/03/2006, 11h46
  3. JBuilder sur MacOS
    Par tonioab dans le forum JBuilder
    Réponses: 3
    Dernier message: 21/10/2005, 12h24
  4. Réponses: 4
    Dernier message: 23/09/2005, 09h16
  5. Portabilité Delphi sur MacOS X ?
    Par chadkops dans le forum Langage
    Réponses: 4
    Dernier message: 25/05/2005, 11h39

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