2009-11-20 35 views
5

Tôi đã tích hợp các mô-đun java đơn giản vào môi trường MATLAB trên Windows với một số thành công. Gần đây tôi gặp phải một vấn đề với một thư viện của bên thứ ba mà cố gắng để tải một dll.UnsatisfiedLinkError Khi tải một thư viện từ Java trong MATLAB

Các ClassLoader java ném UnsatisfiedLinkError khi tải được cố gắng:

java.lang.UnsatisfiedLinkError: no <libname> in java.library.path 

at java.lang.ClassLoader.loadLibrary(Unknown Source) 

at java.lang.Runtime.loadLibrary0(Unknown Source) 

at java.lang.System.loadLibrary(Unknown Source) 

Các ngoại lệ được báo cáo rằng 'libname' của tôi không nằm trong bất động sản java.library.path. Tôi đã xác minh rằng tài sản thực sự có đường dẫn chính xác trong nó, và rằng các tập tin libname.dll tồn tại trên đường dẫn đó.

Tôi đã xác minh java.library.path theo hai cách. Trước tiên, tôi chỉ đơn giản là kiểm tra rằng giá trị trả về trên dòng lệnh MATLAB:

>> java.lang.System.getProperty('java.library.path') 

Sau đó, tôi đổi phương pháp java trong câu hỏi để in giá trị mà chỉ trước khi cuộc gọi vào các chức năng của bên thứ ba không:

System.out.println(System.getProperty('java.library.path')); 

Cả hai đều xác nhận rằng giá trị đường dẫn của tôi đã được đặt như mong đợi.

Tôi cũng đã cố tải thủ công thư viện từ dòng lệnh và không thành công với cùng kết quả.

Đây có phải là điều không thể xảy ra trong MATLAB hay không, tôi có thiếu gì đó ở đây không? Thật không may tôi không phải là quản trị viên trên máy này vì vậy tôi không thể thử lừa cũ của việc di chuyển dll vào một thư mục với dlls mà làm việc.

Tôi hoan nghênh mọi đề xuất cho mọi thứ cần thử nếu không có câu trả lời tuyệt đối.

Hệ điều hành: Windows XP MATLAB R2009a Java 1.6

+0

làm thế nào bạn xác minh giá trị của thuộc tính java.library.path? –

+0

@matt b: Tôi đã thêm chi tiết vào bài đăng để trả lời câu hỏi của bạn. –

+0

bạn có thể xem mã thư viện của bên thứ ba đang cố gắng tải (bằng cách xem nguồn) không? nó là cùng một thư viện được báo cáo trong UnsatisfiedLinkError? – bm212

Trả lời

4

Chỉ cần thấy điều này trong các tài liệu MATLAB:

Xác định con đường tìm kiếm cho Sun Java Native Method DLL

Cơ chế mà MATLAB sử dụng để xác định vị trí thư viện phương pháp tự nhiên được yêu cầu của Java có đã thay đổi. MATLAB không còn sử dụng các biến môi trường hệ thống để xác định đường dẫn đến các thư viện này.

cân nhắc Compatibility

Nếu bạn hiện nay dựa vào PATH (dành cho Windows) hoặc LD_LIBRARY_PATH (đối với UNIX) biến môi trường cho mục đích này, bạn sẽ cần phải sử dụng các tập tin librarypath.txt, như mô tả dưới đây, ở vị trí của nó.

Xác định Thư viện Java Đường dẫn

lớp Java có thể tự động tải các phương pháp tự nhiên bằng cách sử dụng phương pháp Java java.lang.System.loadLibrary ("LibFile"). Để phần mềm JVM định vị tệp thư viện được chỉ định, thư mục chứa nó phải nằm trên Đường dẫn Thư viện Java. Con đường này được thiết lập khi MATLAB ra mắt phần mềm JVM lúc khởi động, và được dựa trên nội dung của file

$ matlab/hộp công cụ/local/librarypath.txt

(trong đó $ matlab là thư mục gốc MATLAB đại diện bởi MATLAB từ khóa matlabroot).

Bạn có thể tăng thêm đường dẫn tìm kiếm cho thư viện phương thức gốc bằng cách chỉnh sửa tệp librarypath.txt. Thực hiện theo các nguyên tắc sau khi chỉnh sửa tệp này:

  • Chỉ định từng thư mục mới trên một dòng.
  • Chỉ chỉ định tên thư mục, không phải tên của các tệp DLL. Cuộc gọi LoadLibrary thực hiện điều này cho bạn.
  • Để đơn giản hóa đặc tả của các thư mục trong môi trường đa nền tảng, bạn có thể sử dụng bất kỳ macro nào sau đây: $ matlabroot, $ arch và $ jre_home.
+0

thú vị và kỳ lạ cùng một lúc. tại sao họ lại làm một điều kỳ lạ như vậy – jitter

4

Bạn có quen thuộc với Process Monitor? (Nếu không, bạn sẽ dễ dàng có được cách thức hoạt động).

Tải xuống. Chạy nó đi. Chỉ cần kích hoạt "Hiển thị hoạt động hệ thống tập tin" (biểu tượng nhỏ bên phải dưới thanh menu), vô hiệu hóa những người khác.

Sau đó kích hoạt bất kỳ điều gì khiến thư viện cố gắng tải dll. Sau khi xảy ra UnsatisfiedLinkError, dừng chụp sự kiện trong Trình theo dõi quy trình.

Bây giờ, hãy thực hiện CTRL + F và tìm tên của tệp cần tải. Kiểm tra mục nhập có thể là "Không tìm thấy" hoặc "Không tìm thấy tên" trong cột kết quả và có tên dll trong cột đường dẫn.

Bây giờ hãy kiểm tra xem nó thực sự trông ở đâu cho dll. Có lẽ nó gắn thêm một số đường dẫn bổ sung hoặc tương tự và do đó không thể tìm thấy nó.

+0

Đó là một gợi ý hay, nhưng tiếc là đây là một máy tính bảo mật - Tôi sẽ không thể cài đặt hoặc chạy các ứng dụng của bên thứ ba không được chấp thuận. Có cách nào tôi có thể thực hiện điều tương tự bằng cách thiết lập các mã (vượt ra ngoài chỉ đơn giản là xác nhận tài sản đường dẫn như đã nêu)? –

+0

Câu trả lời hay, cảm ơn bạn! – volni

0

Thư viện của bạn có phụ thuộc vào các dll khác không? Nó có thể là java dll được tải như là kết quả của cuộc gọi loadLibrary() của nó đòi hỏi dlls khác. Trên Windows, tôi tin rằng nó sẽ nhìn vào% PATH% để cố gắng tìm những dll này.

Đây không phải là điều java hoàn toàn; nó có liên quan nhiều hơn với thư viện gốc mà bạn đang tải. Java được cho biết nơi tìm dll qua java.library.path (hoặc bất kỳ cơ chế Matlab nào khác sử dụng), và libname.dll sẽ sử dụng% PATH% để tìm bất kỳ dll nào tùy thuộc vào.

Như bạn nói rằng dll bị thiếu nằm trong java.library.path của bạn, có lẽ bạn có thể thử thêm giá trị java.library.path vào% PATH% và thử lại?

1

Đặt DLL mà bạn cố gắng tải sử dụng java.lang.System.loadLibrary vào thư mục sau: $ matlabroot \ sys \ java \ jre \ thắng ?? \ jre \ bin \

+0

wow, điều này đã làm việc! Nhưng tại sao điều này làm việc khi thêm java.library.path sẽ không ?? –