Peter____ Ответов: 1

Вызов Jni не работает одновременно с swing API


Привет,

Я хочу вызвать функцию Jni из класса java в Netbeans, но функция Jni выполняется только тогда, когда я закрываю графический интерфейс Swing.

Как это может быть
Hello World from C
отображается в единицах при запуске приложения?


Есть какие-то решения?

Что я уже пробовал:

* @author peter
 */
public class Linux_Kamera_AWT extends java.awt.Frame {

    /**
     * Creates new form Linux_Kamera_AWT
     */
    public Linux_Kamera_AWT() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        Start_JNI = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();

        jButton1.setText("jButton1");

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        Start_JNI.setText("jButton2");
        Start_JNI.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                Start_JNIActionPerformed(evt);
            }
        });
        add(Start_JNI, java.awt.BorderLayout.NORTH);

        jButton3.setText("jButton3");
        add(jButton3, java.awt.BorderLayout.WEST);

        pack();
    }// </editor-fold>                        

    /**
     * Exit the Application
     */
    private void exitForm(java.awt.event.WindowEvent evt) {                          
        System.exit(0);
    }                         

    private void Start_JNIActionPerformed(java.awt.event.ActionEvent evt) {                                          
        // TODO add your handling code here:
        
        callNativeFunction();
        JNIServer.nativePrint();
    }                                         

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        //JNIServer.nativePrint();
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Linux_Kamera_AWT().setVisible(true);
            }
        });
    }
    
    
    private static void callNativeFunction() {
        Thread nativeFunctionThread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Test.run - before calling hello.");
                new JNIServer().nativePrint();  // where hello is native method
                System.out.println("Test.run - after calling hello.");
            }
        });

        nativeFunctionThread.start();
    }


    // Variables declaration - do not modify                     
    private javax.swing.JButton Start_JNI;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton3;
    // End of variables declaration                   
}


Файл С Исходным Кодом :

// * To change this license header, choose License Headers in Project Properties.
#include <jni.h>
#include <stdio.h>
#include "Linux_Kamera.h"

JNIEXPORT void JNICALL Java_humer_peter_JNIServer_nativePrint
        (JNIEnv *env, jobject obj)
{

    printf("\nHello World from C\n");

}


public class JNIServer {
    public native void hello();

    static {  
        System.out.println("Inload library");
        System.loadLibrary("JNI_Lib");
    }  
}



С-Заголовка Файл:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class humer_peter_JNIServer */

#ifndef _Included_humer_peter_JNIServer
#define _Included_humer_peter_JNIServer
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     humer_peter_JNIServer
 * Method:    nativePrint
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_humer_peter_JNIServer_nativePrint
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

1 Ответов

Рейтинг:
8

Richard MacCutchan

Вы вызываете printf из оконного приложения. Но printf использует консоль, которая не существует в AWT.


Peter____

Привет Ричард,

твой ответ решил мою проблему.
Собственный метод printf также может быть отображен путем вызова метода flush в C.


https://stackoverflow.com/questions/23085044/jni-system-out-and-printf-behaviour

Спасибо,

Питер