Domanda

Ho scritto un'applicazione in Java e compilato con successo usando gcj . Ha funzionato sorprendentemente bene, ma ho incontrato un ostacolo: posso solo eseguire il file eseguibile tramite uno script di shell, perché devo specificare i percorsi di libreria

.

Le librerie ho bisogno sono SWT, Xerces e GNU-crypto.

C'è un modo per collegare in modo statico le librerie durante la compilazione in gcj, o si tratta di una buona idea? In alternativa, posso specificare la (relativa) del percorso di libreria durante la compilazione?

Al momento, il mio script di shell assomiglia a questo:

#!/bin/sh
export LD_LIBRARY_PATH=./libs/:$LD_LIBRARY_PATH
exec ./MyJavaApp $*
È stato utile?

Soluzione

L'idea è di rendere il campo statico "sys_paths" null in modo che sarebbe costruire i percorsi dal valore modificato. Vedi il post qui (post # 223 da AjaySingh516) http: //forums.sun .com / thread.jspa? messageId = 3744346 # 3744346

Class clazz = ClassLoader.class;
Field field = clazz.getDeclaredField("sys_paths");
boolean accessible = field.isAccessible();
if (!accessible)
    field.setAccessible(true);
Object original = field.get(clazz);
// Reset it to null so that whenever "System.loadLibrary" is called, it
// will be reconstructed with the changed value.
field.set(clazz, null);
try {
    // Change the value and load the library.
    System.setProperty("java.library.path", "./libs/");
    System.loadLibrary("mylibapr");
} finally {
    // Revert back the changes.
    field.set(clazz, original);
    field.setAccessible(accessible);
}

.

gcj Proprietà del sistema (Vedi: Proprietà standard supportati da libgcj)

http://gcc.gnu.org/onlinedocs/gcj/System -properties.html

.

Soluzione # 2 : Imposta variabile di ambiente di sistema al momento della compilazione

http://linux.die.net/man/1/gcj

Per questo è necessario utilizzare il parametro -Djava.library.path=./libs/ con gcj

Da manuale gcj (link sopra):

- principale = CLASSNAME

Questa opzione viene utilizzata durante il collegamento per specificare il nome della classe il cui metodo "main", occorre fare ricorso quando l'eseguibile risultante viene eseguito.

-dname [= valore]

Questa opzione può essere utilizzata solo con "--main". Esso definisce una proprietà di sistema nome denominato con il valore valore. Se il valore non è specificato, verrà utilizzata la stringa vuota. Queste proprietà di sistema vengono inizializzati all'avvio del programma e possono essere recuperati in fase di esecuzione con il metodo "java.lang.System.getProperty".

ho mai lavorato con gcj ma secondo documenti queste proprietà del sistema possono essere recuperati in fase di esecuzione, per cui sarà portabile ad altri sistemi.

Si veda anche: http: //gcc.gnu. org / wiki / Statically_linking_libgcj? action = Mostra & reindirizzare = staticamente + collega + libgcj

Altri suggerimenti

Per rispondere alla prima parte della sua domanda -

Dalla pagina gcj man: "Linking statico libgcj può causare parti essenziali della libgcj per essere omessi. Alcune parti d'uso libgcj riflessione per caricare le classi in fase di esecuzione. Dal momento che il linker non vede questi riferimenti in fase di collegamento, si può omettere la cui classi. Il risultato è di solito (ma non sempre) un "ClassNotFoundException" essere gettato in fase di esecuzione. Attenzione deve essere utilizzato quando si utilizza questa opzione ".

Per il collegamento statico delle altre biblioteche, non sono sicuro. Non ho avuto un motivo per farlo.

Linux eseguibili sono diverse da quelle di Windows. Normalmente si ha un po 'tale sistema a seconda di quale esatto a finestre che si sta utilizzando "launcher" o. È possibile impostare l'icona in quanto, non sul file eseguibile stesso. Di solito, gli script di avvio vengono utilizzate per impostare qualsiasi ambiente che è necessario per l'esecuzione l'eseguibile. Ancora una volta, tutto questo dipende dal sistema esatto finestra del desktop.

Perché stai usando un AOT? Vorrei suggerire la lettura del seguente articolo . Uno degli svantaggi che menziona per AOTS è il seguente ...

  

applicazioni dinamiche. Le classi che l'applicazione carica dinamicamente a runtime potrebbero non essere disponibili per lo sviluppatore di applicazioni. Questi possono essere i plug-in di terze parti, proxy dinamici ed altre classi generate in fase di esecuzione e così via. Così il sistema di runtime deve includere un interprete di bytecode Java e / o un compilatore JIT.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top