PDA

View Full Version : C versus JAVA


mjordan
25-08-2003, 23:11
Non, non devo scatenare alcuna guerra. Ho solo questo problema:

Fatto il seguente stupido programma Java:


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

class CloseableFrame extends JFrame {
public CloseableFrame()
{
setTitle("Lanciato da C");
setSize(320, 200);

addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
}

public class myFrame {
public static void main(String[] args)
{
JFrame frame = new CloseableFrame();
frame.show();
}
}


e adeguatamente compilato, volevo provare ad avviare la JVM come un normale processo, con il seguente programma C:


/* -*-linux-c-*- */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

/* Variabili globali. */
extern int errno;
pid_t pid;

/*
** Duplicazione dello spazio di indirizzi.
*/
void
spawn_process(const char * progname,
const char * args)
{
extern char ** environ;

pid = fork();

if (pid == 0) { // Processo child.
execle(progname, args, environ);
_exit(EXIT_FAILURE);
}

return;
} // spawn_process()

int
main(int argc, char ** argv)
{
int status = 0;
const char * progname = "/usr/share/j2sdk1.4.2/bin/java";
const char * args = "myFrame";

spawn_process(progname, args);

status = wait(&pid);

/*
** Controllo del segnale di uscita.
*/
if (WIFSIGNALED(status))
fprintf(stderr, "%d: Terminato dal segnale %d: %s\n",
(int)pid, WTERMSIG(status), strerror(errno));

return 0;
}


Quello che ottengo è un misero messaggio della JVM di impossibilità nel trovare libjava.so

Allora ho fatto una prova (non convinto, visto che ho già passato l'environment), settando il path della libreria prima in /etc/ld.so.conf e poi esportando la variabile LD_LIBRARY_PATH.

Risultato? Uguale a prima. Cosa potrebbe essere? Non mi è mai capitata una situazione del genere...

mjordan
26-08-2003, 22:44
UP.

Possibile non ci sia nessuno che abbia mai creato processi UNIX?
:confused: :eek:

mjordan
28-08-2003, 00:23
Up.

Il primo che risponde di usare JNI lo derapo :D

x110
02-09-2003, 23:03
per quanto riguarda il codice non sono esperto java...
ma quando hai hetto che hai modificato ld.so.conf ho pensato--->non distruggermi
hai ricreato la "calce" con ldconfig?
se fosse la soluzione e' intervenuto dio.

VICIUS
02-09-2003, 23:28
Dalla versione 1.3.1 del jdk/jre è possibile far terminare il programma alla chiusura del frame usando setDefaultCloseOperation:


wnd = new JFrame("bla bla bla ...");
wnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

per quano riguarda il problema è incredibile che non riesca a trovare il percorso dell file libjava.so. l'unica cosa che mi viene in mente è controllare JAVA_HOME e CLASS_PATH ma dubito che possano risolvere il problema.

ciao ;)

mjordan
03-09-2003, 15:14
Originariamente inviato da x110
per quanto riguarda il codice non sono esperto java...
ma quando hai hetto che hai modificato ld.so.conf ho pensato--->non distruggermi
hai ricreato la "calce" con ldconfig?
se fosse la soluzione e' intervenuto dio.

Ovvio che l'ho fatto. :D

mjordan
03-09-2003, 15:21
Originariamente inviato da VICIUS
Dalla versione 1.3.1 del jdk/jre è possibile far terminare il programma alla chiusura del frame usando setDefaultCloseOperation:


wnd = new JFrame("bla bla bla ...");
wnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


Già, ma ho ripreso questo programma di esempio di classe locale anonima da un mio vecchio floppy. E' stato allora che mi è venuto in mente quest'idea che ora non mi fa domire la notte. La JVM è l'unico programma che non sono riuscito a lanciare come sottoprocesso di un altro programma.


per quano riguarda il problema è incredibile che non riesca a trovare il percorso dell file libjava.so. l'unica cosa che mi viene in mente è controllare JAVA_HOME e CLASS_PATH ma dubito che possano risolvere il problema.

ciao ;)

Risulta incredibile anche per me. Sembra che la JVM non legga per niente le informazioni sull'ambiente. Se fosse così, dovrebbe leggere la sua libreria dal SUO PATH nella SUA gerarchia di directory. Neanche quello fa. :rolleyes:

Sta cosa la devo portare a fondo.