2014-08-28 9 views
5

È possibile posizionare due versioni (64-bit e 32-bit) di una DLL nativa su java.library.path?Posso posizionare sia le versioni a 32 bit che a 64 bit di una libreria nativa su java.library.path?

Sono preoccupato che se avessi posizionato le versioni a 64-bit e 32-bit nel percorso della libreria nativa, ci sarebbe un'eccezione di collegamento insoddisfatta in esecuzione per un'architettura diversa. In tal caso, qual è la soluzione preferita? avere un flag nel mio script gradle/maven build che collega la libreria corretta?

Attualmente sto facendo le seguenti: -

-Djava.library.path=/out/lib/win64jdk;/out/lib/winx86jdk 

Sia che contiene le DLL rilevanti per l'architettura. Al momento non sono sicuro che la JVM possa determinare i simboli.

risposta

2

Se fossi in te mi piacerebbe garantire che solo l'appropriato nativo dll era nel pacchetto distribuibile e lasciare l'altro fuori.

Se tuttavia si desidera distribuire entrambi, è necessario scrivere del codice Java per caricare la libreria corretta. System.loadLibrary viene utilizzato per caricare una libreria nativa e la cosa normale da fare è richiamarla in un inizializzatore statico nel codice Java.

A meno che non siete disposti a fare affidamento rozzamente sulle eccezioni, è possibile utilizzare questo codice:

System.getProperty("sun.arch.data.model") 

di caricare la libreria nativa appropriata. Questa funzione restituirà 32 o 64 di conseguenza.

+0

Attualmente non sono in grado di modificare il codice java ma sono in procinto di ordinare lo script di build, quindi userò Gradle per determinare se la build è per 64 bit/32 bit finché non posso apportare modifiche al codice per caricare il corretto biblioteca. – chrisw

1

È possibile scegliere di non aggiungere nessuno di essi, quindi prima di averne bisogno (ad es. All'avvio dell'applicazione), caricare quello corretto in base all'architettura di sistema corrente.

È possibile caricarlo con System.loadLibrary():

boolean is64bit = ...; // See below how to detect 
System.loadLibrary("/out/lib/win" + (is64bit ? "64jdk" : "x86jdk")); 

Rilevare l'architettura:

How can I tell if I'm running in 64-bit JVM or 32-bit JVM (from within a program)?

+0

Attualmente non sono in grado di modificare il codice java ma sono in procinto di ordinare lo script di build, quindi userò Gradle per determinare se la build è per 64 bit/32 bit finché non posso apportare modifiche al codice da caricare la libreria corretta. – chrisw

Problemi correlati