2012-02-17 15 views
5

Un poco de fondo: Tengo una aplicación de Java que necesita hablar con un hardware de terceros en mac. Me han dado el SDK pero no está en Java. Así que estoy tratando de hacer jnilib que actuará como un puente entre mi aplicación java y el SDK.Mac + jni + java

El problema: he hecho una pequeña jnilib muestra que se comunica con el SDK, pero cuando trato de usarlo en mi programa de java me sale el siguiente error

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) 

Desde el error parece que mi libSmartTest7.jnilib está buscando la biblioteca SMARTResponseSDK.

Lo que he intentado Sé dónde está la biblioteca SMARTResponseSDK en mi Mac. Intenté copiarlo en mi carpeta de trabajo en Eclipse, pero sigo recibiendo el error. He intentado usar el -DJava.library.path pero sigo recibiendo el error.

Cualquier idea sobre cuál sería el mejor enfoque posible.

+0

En OSX, la biblioteca debe encontrarse dentro de java.library.path o de la variable de entorno DYLD_LIBRARY_PATH. También debe verificar su biblioteca para asegurarse de que no utiliza una ruta absoluta específica para la biblioteca dependiente (a menos que esté en una ubicación instalada en el sistema). – technomage

+0

Hola Gracias por tu comentario. Lo siento, pero parece que fue un error mío. Había dos bibliotecas "SMARTResponseSDK". parece que usé el incorrecto mientras construía mi jnilib. Utilicé el otro "SMARTResponseSDK" y el problema parece haberse solucionado. – user1216750

+0

También puede considerar Rococoa, que le permite evitar escribir cualquier código nativo y acceder a la biblioteca de terceros directamente desde Java. – technomage

Respuesta

0

Una vez que esté dentro de JNI código, ya no importa lo que java.library.path apunta a.

Una vez dentro código JNI, todo lo que puede hacer es asegurarse de que la biblioteca es visible a través de su código LD_LIBRARY_PATH/DYLD_LIBRARY_PATH, o puede cargar dinámicamente el archivo de la biblioteca desde cualquier lugar que desee.

Por lo tanto, para usted, sugiero echar un vistazo aquí:

También puede beneficiarse de los indicadores de compilación mientras construye su biblioteca JNI y use rpath.