2010-03-29 29 views
9

Tôi đang cố tải một dll vào java bằng cách sử dụng đoạn mã sau System.loadLibrary ("mydll");Đang tải DLL trong Java - Eclipse - JNI

Dự án được đặt trong D: \ development \ project \ và tôi đã đặt dll lên D :. Sau đó tôi đã đưa ra đối số VM sau trong cấu hình eclipse -Djava.library.path = D:/

Nhưng khi tôi chạy, tôi nhận được UnsatisifiedLinkerError. Sau khi googling một chút, tôi đã sử dụng System.load ("D: \ mydll.dll");

nhưng lại gặp vấn đề tương tự, ai đó có thể giúp bạn?

+0

Tôi đã thử nghiệm classpath của tôi với mã System.getProperty này ("java.class.path") và đặt dll trên con đường cụ thể đó. Sau đó, tôi nhận được lỗi "Không thể tìm thấy thư viện phụ thuộc". Làm thế nào tôi có thể kiểm tra những thư viện nó được yêu cầu: S. Tôi đang sử dụng một số Dll của bên thứ ba. –

Trả lời

7

Nơi bạn chỉ định tên tệp DLL trong đường dẫn thư viện, hãy bỏ qua điều đó. Ngoài ra, cuộc gọi System.loadLibrary của bạn chỉ nên là 'mydll'. Tôi có thể cho bạn biết (từ kinh nghiệm) rằng nếu bạn đặt DLL trong thư mục gốc của dự án của bạn trong Eclipse (tức là, D: \ Eclipse Workspace \ Proj), nó nên hoạt động. Bất kỳ lỗi liên kết nào khác có thể là từ các vấn đề phụ thuộc với việc tìm các DLL khác. Ngoại lệ là như nhau. Sử dụng một cái gì đó như Dependency Walker (http://www.dependencywalker.com/) để xem nếu DLL của bạn dựa vào bất cứ điều gì khác không phải trên đường dẫn thư viện hệ thống.

Chỉnh sửa: UnsatisfiedLinkError: Bị ném nếu máy ảo Java không thể tìm thấy định nghĩa ngôn ngữ gốc thích hợp của phương pháp được khai báo gốc - có vẻ như bạn đang sử dụng hàm JNI không tồn tại.

3

Sử dụng System.loadLibrary("mydll") hoạt động tốt, bạn cũng có thể sử dụng tính năng đó. Nếu bạn sử dụng javah và bạn nghĩ rằng với DLL tất cả mọi thứ của bạn là tốt, có hai possibilies:

  1. Các JVM không tìm thấy DLL của bạn: Trong trường hợp này, thư viện đường java của bạn là không đúng (mà tôi nghi ngờ) và bạn có thể đặt nó là . và đặt DLL của bạn trong thư mục làm việc hiện tại.
  2. Các JVM không tìm thấy một DLL DLL của bạn phụ thuộc vào: Nếu bạn có bất kỳ thư viện phụ thuộc trong DLL của bạn, họ là KHÔNG tìm kiếm bởi JVM, nhưng do bản thân Windows. Và Windows không biết java.library.path, do đó, nó sẽ tìm kiếm trong biến số PATH của hệ thống cho những người đó. Nếu bạn có khả năng, bạn có thể đặt biến hệ thống PATH đến vị trí của các tệp DLL của bạn trước khi bắt đầu JVM và mọi thứ sẽ ổn. Hoặc bạn có thể tải tất cả các tệp DLL của mình bằng cách sử dụng JVM như thế này

    System.loadLibrary ("dll_1");
    System.loadLibrary ("dll_2");
    System.loadLibrary ("dll_3");

    nơi dll_3.dll phụ thuộc vào dll_2.dll, phụ thuộc vào dll_1.dll.

Hy vọng điều đó sẽ hữu ích.

+0

Hình như, dưới Linux khái niệm đó không hoạt động bằng cách nào đó, không ai biết tại sao? – Zorkus

+0

Tôi cũng nên làm việc với tôi dưới Linux. Bạn đang cố gắng tải loại thư viện nào? –

0

@ alee- Bạn chỉ có thể sao chép và dán các tệp dll trong thư mục system32 của các cửa sổ và thử gọi thư viện thông qua System.loadLibrary ("mydll") ... tôi đoán nó có thể hoạt động ...

4

Kiểm tra cách thiết lập đúng các phụ thuộc gốc here. Ngoài ra, hãy đảm bảo bạn sử dụng đúng JVM: trong trường hợp của tôi, DLL không được tìm thấy vì nó là một DLL 32 bit, nhưng tôi đã sử dụng JVM x64!

1

Đặt Almafa.dll của bạn vào C:/Java/jre7/lib hoặc/bin xin lỗi, tôi không thể nhớ chính xác. Sau khi bạn đã thực hiện không có cấu hình hơn cần thiết, chỉ cần nói

static{ System.LoadLibrary("Almafa"); }

trong lớp, nơi mà bạn muốn tải nó. Nó chỉ hoạt động trong dự án Java, trong Android giống như dự án bạn cần sử dụng JNI. Tôi đã đăng ngay bây giờ là kết quả của 3 ngày không ngủ :)

2

Một vấn đề bạn có là: System.load ("D: \ mydll.dll"); phải là System.load ("D: \\ mydll.dll"); hoặc System.load ("D: /mydll.dll");

Tôi đã thành công hơn với System.load, nhưng loadlibrary được thiết kế tốt hơn cho nhiều nền tảng. Nó chỉ ra phần mở rộng cho bạn.

0

Cho đường dẫn thư viện trong dự án của bạn như vị trí thư viện bản địa, dường như để được giải quyết.

0

tôi bị lỗi của tôi được giải quyết bằng cách sử dụng như sau:

static { 
    try { 
     System.loadLibrary("myDLL"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Thay vì sử dụng System.load("myDLL.dll")

Các vấn đề liên quan