Domanda

Esempio:Ho due oggetti condivisi (lo stesso dovrebbe valere per .dlls).Il primo oggetto condiviso proviene da una libreria di terze parti, lo chiameremo libA.so.Ne ho racchiuso parte con JNI e ho creato la mia libreria, libB.so.Ora libB dipende da libA.

Durante l'avvio del web, entrambe le librerie si trovano in alcune aree di lavoro del webstart.Il mio codice Java tenta di caricare libB.A questo punto il caricatore di sistema tenterà di caricare libA che non si trova nel percorso della libreria di sistema (java.library.path non aiuterà in questo).Il risultato finale è che libB ha un collegamento insoddisfatto e non può essere utilizzato.

Ho provato a caricare libA prima di libB, ma ancora non funziona.Sembra che il sistema operativo voglia eseguire il caricamento per me.C'è un modo per far funzionare questo lavoro oltre alla compilazione statica?

È stato utile?

Soluzione 2

La compilazione statica si è rivelata l'unico modo per avviare sul web più librerie native dipendenti.

Altri suggerimenti

Non sono sicuro che questo verrebbe gestito esattamente allo stesso modo per webstart, ma ci siamo imbattuti in questa situazione in un'applicazione desktop quando abbiamo a che fare con un set di librerie native (dll nel nostro caso).

Il caricamento di libA prima di libB dovrebbe funzionare, a meno che una di queste librerie non abbia una dipendenza non considerata e non nel percorso.La mia comprensione è che una volta che si arriva a una chiamata di sistema loadLibrary (ad es.Java ha trovato la libreria nel suo java.library.path e ora sta dicendo al sistema operativo di caricarla) - dipende completamente dal sistema operativo trovare eventuali librerie dipendenti, perché a quel punto è il sistema operativo che sta caricando la libreria libreria per il processo e il sistema operativo sa solo come cercare nel percorso di sistema.Sembra difficile da impostare nel caso di un'app Webstart, ma esiste un modo per aggirare questo problema che non implica la compilazione statica.Potresti essere in grado di mescolare dove sono le tue biblioteche, non ne sono sicuro

Se utilizzi un classloader personalizzato, puoi sovrascrivere loadLibrary e findLibrary in modo che possa individuare le tue librerie dall'interno di un jar nel tuo classpath e se lo rendi anche consapevole delle dipendenze della tua libreria nativa (ad es.libB dipende da libA dipende da libX, quindi quando carichi libB puoi sorprenderti e assicurarti di caricare prima libA, e controllando quell'avviso e caricando prima libX.Quindi il sistema operativo non tenta di trovare una libreria che non si trova nel tuo percorso.È complicato e un po' doloroso, ma può funzionare garantire che Java li trovi e li carichi tutti nell'ordine corretto.

Entrambe le librerie native sono racchiuse in un file firmato jar elencato come

<nativelib ...> 

Nel file JNLP?

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