2012-02-17 26 views
5

Một nền nhỏ: Tôi có một ứng dụng java cần nói chuyện với phần cứng của bên thứ ba trên mac. Họ đã cho tôi sdk nhưng nó không có trong Java. Vì vậy, tôi đang cố gắng để làm cho jnilib sẽ hoạt động như một cầu nối giữa ứng dụng java của tôi và SDK.Mac + jni + java

Vấn đề: Tôi đã thực hiện một jnilib mẫu nhỏ mà nói chuyện với SDK nhưng khi tôi cố gắng sử dụng nó trong chương trình java của tôi, tôi nhận được lỗi sau

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) 

Từ các lỗi có vẻ như tôi libSmartTest7.jnilib đang tìm thư viện SMARTResponseSDK.

Điều tôi đã thử Tôi biết thư viện SMARTResponseSDK nằm trên máy Mac của tôi. Tôi đã thử sao chép nó vào thư mục làm việc của tôi trong nhật thực nhưng tôi vẫn nhận được lỗi. Tôi đã thử sử dụng -DJava.library.path nhưng tôi vẫn gặp lỗi.

Bất kỳ ý tưởng nào về cách tiếp cận tốt nhất có thể là gì.

+0

Trên OSX, thư viện phải được tìm thấy trong java.library.path hoặc biến môi trường DYLD_LIBRARY_PATH. Bạn cũng nên kiểm tra thư viện của mình để đảm bảo thư viện không sử dụng đường dẫn tuyệt đối cụ thể cho thư viện phụ thuộc (trừ khi nó ở vị trí được hệ thống cài đặt). – technomage

+0

Xin cảm ơn lời cảm ơn của bạn. Tôi xin lỗi nhưng có vẻ như đó là lỗi của tôi. Có hai thư viện "SMARTResponseSDK". có vẻ như tôi đã sử dụng sai trong khi xây dựng jnilib của tôi. Tôi đã sử dụng "SMARTResponseSDK" khác và vấn đề dường như đã bị xóa. – user1216750

+0

Bạn cũng có thể xem xét Rococoa, cho phép bạn tránh viết bất kỳ mã gốc nào và truy cập thư viện của bên thứ ba trực tiếp từ Java. – technomage

Trả lời

0

Khi bạn ở trong mã JNI, nó không còn quan trọng số java.library.path điểm tại.

Khi bạn đang ở trong JNI mã, tất cả các bạn có thể làm là để đảm bảo thư viện là có thể nhìn thấy mã của bạn qua LD_LIBRARY_PATH/DYLD_LIBRARY_PATH, hoặc bạn có thể tự động tải tập tin thư viện của bạn từ bất kỳ vị trí bạn muốn.

Vì vậy, đối với bạn, tôi đề nghị để có một cái nhìn ở đây:

Bạn cũng có thể hưởng lợi từ cờ tổng hợp khi xây dựng thư viện JNI của mình và sử dụng rpath.