Pb avec objc_msgSend

OimyOimy Membre
11 juin modifié dans Dev. macOS #1

Bonjour,

J'espère être dans la bonne catégorie, j'hésitais avec "Objective-C, Swift, C, C++".

J'ai le même soucis que la personne sur ce forum : https://stackoverflow.com/questions/14661249/java-jni-creating-a-swing-window-using-jni-from-c

J'utilise la solution qu'il préconise avec un programme simple et cela fonctionne (ouverture d'une fenêtre avec Java).
Par contre quand j'insère le code dans projet global j'ai un soucis au niveau de la ligne "d _Nullable app = objc_msgSend(clazz, sel_registerName("sharedApplication"));" dans la fonction "static void runCocoaMain(void)" qui me donne l'erreur suivante :

A fatal error has been detected by the Java Runtime Environment:

SIGSEGV (0xb) at pc=0x00007fff5f159165, pid=2972, tid=0x0000000000000307

JRE version: Java(™) SE Runtime Environment (8.0_172-b11) (build 1.8.0_172-b11)
Java VM: Java HotSpot(™) 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_pid2972.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.

En PJ le fichier hs_err_pid2972.log

Quelqu'un pourrait m'orienter pour trouver ce qu'il me manque ou ce qu'il peut y avoir de trop afin que ce bout de code fonctionne correctement dans mon projet global.

Merci d'avance

Réponses

  • OimyOimy Membre

    Désolé mon copier coller de l'erreur à changer la police.
    Comme je suis novice dans la lecture d'un fichier .log, quelqu'un connaitrait il un tuto afin de m"aider à le décrypter ?

  • Joanna CarterJoanna Carter Membre, Modérateur

    @Oimy a dit :
    Désolé mon copier coller de l'erreur à changer la police.

    C'est parce que, ici, on utilise le Markdown et chaque ligne du log commence par un #, ce qui signifie un paragraph "titre"

    J'ai corrigé le texte pour vous en le mettant en italique

  • OimyOimy Membre

    Merci beaucoup, je ferais attention la prochaine fois.

  • OimyOimy Membre
    11 juin modifié #5

    Peut être une autre possibilité de s'en sortir, j'ai un code simple :

    CPP:
    _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
         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
        jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);  // YES !!
        delete options;    // we then no longer need the initialisation options. 
    
            jclass cls2 = env->FindClass("MyTest2");  // try to find the class 
        if(cls2 != nullptr) 
               {
            jmethodID mid = env->GetStaticMethodID(cls2, "run", "()V");
            if(mid != nullptr)
                          {
                          env->CallStaticVoidMethod(cls2, mid);
                          runCocoaMain();
                  }
               }
        jvm->DestroyJavaVM();
    }_
    
    JAVA:
    _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);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
    
            }
        }
    
        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());
                } catch (Exception exc) {
                    throw new RuntimeException(exc);
                }
            }
        }
    
        public static void run() {
            Thread gui = new Thread(new GUI());
            gui.start();
        }
    }
    _
    

    Le but étant d'ouvrir une JFrame avec JNI. J'utilise la fonction "runCocoaMain(void)" pour que la JFrame fonctionne comme expliqué là https://stackoverflow.com/questions/14661249/java-jni-creating-a-swing-window-using-jni-from-c
    L'idée serait :
    Soit de ne pas utiliser la fonction runCocoaMain()
    Soit de trouver pourquoi elle ne fonctionne pas (cf erreur premier poste).

  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu sais que tu participe dans un forum pour les développeurs macOS et iOS ?

    Ce dit, il y a très peu qui travaille en C ou C++ ; la plupart c'est l'Objective-C ou Swift. Et je dirais en plus qu'il y a moins que ça qui travaille en Java, étant donné qu'il n'est pas dispo sur iOS et à peine utilisé sur macOS.

  • OimyOimy Membre

    Ok.
    Je suis aussi sur MacOS et Java est vraiment secondaire. Mais je vais aller voir du côté du forum C++.

    Merci

Connectez-vous ou Inscrivez-vous pour répondre.