2012-02-17 15 views
5

Un po 'di background: Ho un'applicazione java che deve comunicare con un hardware di terze parti su mac. Mi hanno dato il sdk ma non è in Java. Quindi sto cercando di creare jnilib che funga da ponte tra la mia applicazione java e l'SDK.Mac + jni + java

Il problema: ho fatto un piccolo jnilib campione che parla al SDK, ma quando cerco di usarlo nel mio programma java ricevo il seguente errore

Exception in thread "main" java.lang.UnsatisfiedLinkError: /Users/john.doe/Desktop/eclipse/workspace/Lesson13_Jni_Smart7/bin/libSmartTest7.jnilib: Library not loaded: build/Release/SMARTResponseSDK.framework/Versions/A/SMARTResponseSDK Referenced from: /Users/john.doe/Desktop/eclipse/workspace/Lesson13_Jni_Smart7/bin/libSmartTest7.jnilib  
Reason: image not found 
    at java.lang.ClassLoader$NativeLibrary.load(Native Method) 
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1827) 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1742) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
    at java.lang.System.loadLibrary(System.java:1045) 
    at com.learning.lesson13.JniSmart7.<clinit>(JniSmart7.java:6) 

Da l'errore sembra che il mio libSmartTest7.jnilib sta cercando la libreria SMARTResponseSDK.

Quello che ho provato So dove si trova la libreria SMARTResponseSDK sul mio Mac. Ho provato a copiarlo nella mia cartella di lavoro in eclipse, ma ho ancora ricevuto l'errore. Ho provato a utilizzare il -DJava.library.path ma ottengo ancora l'errore.

Qualche idea su quale sarebbe il miglior approccio possibile.

+0

Su OSX, la libreria deve essere trovata all'interno di java.library.path o della variabile di ambiente DYLD_LIBRARY_PATH. È inoltre necessario controllare la libreria per assicurarsi che non stia utilizzando un percorso assoluto specifico per la libreria dipendente (a meno che non si trovi in ​​un percorso installato dal sistema). – technomage

+0

Ciao Grazie per il tuo commento. Mi dispiace ma sembra che sia stato un mio errore. C'erano due librerie "SMARTResponseSDK". sembra che ho usato quello sbagliato mentre costruivo il mio jnilib. Ho usato l'altro "SMARTResponseSDK" e il problema sembra essere stato cancellato. – user1216750

+0

Si potrebbe anche prendere in considerazione Rococoa, che consente di evitare di scrivere qualsiasi codice nativo e accedere alla libreria di terze parti direttamente da Java. – technomage

risposta

0

Una volta che si è all'interno del codice JNI, non importa più cosa java.library.path punti a.

Una volta che siete dentro codice JNI, tutto si può fare è assicurarsi biblioteca è visibile al codice tramite LD_LIBRARY_PATH/DYLD_LIBRARY_PATH, oppure è possibile in modo dinamico caricare il file di libreria da qualsiasi luogo che ti piace.

Quindi, per voi, vi suggerisco di dare un'occhiata qui:

È inoltre possibile trarre vantaggio dai flag di compilazione durante la creazione della libreria JNI e utilizzare percorso.