OSGi không thể tìm thấy tệp DLL của tôi và tôi không thể tìm ra lý do tại sao.Tải DLL (sử dụng JNA) bên trong một gói OSGi
Hiện tại tôi có tệp DLL (foo.dll
) ở gốc gói của mình, tôi cũng đã thử có trong thư mục libs
.
Các Manifest cho bó trong câu hỏi trông giống như sau:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: foobundle
Bundle-SymbolicName: com.foo.bar
Bundle-Version: 1.0.0
Bundle-Vendor: me
Import-Package: com.sun.jna,
com.sun.jna.ptr,
com.sun.jna.win32
Export-Package: com.foo.bar
Bundle-NativeCode: foo.dll;
osname=WindowsXP;
processor=x86
Sau đó, trong giao diện JNA của tôi, tôi thực hiện một LoadLibrary (theo tài liệu):
public interface MyFooInterface extends com.sun.jna.Library{
static final MyFooInterface INSTANCE = (MyFooInterface)com.sun.jna.Native.loadLibrary("foo", MyFooInterface .class);
// specific interface defs here...
}
Sau đó, trong lớp khác Tôi cố gắng sử dụng giao diện JNA
// ...code
int var = MyFooInterface.INSTANCE.bar();
// ...more code
Tôi có JNA được cung cấp qua một gói khác le (xuất khẩu com.sun.jna và các gói khác được nhập ở trên), nhưng cũng đã thử đóng gói nó với gói được định nghĩa ở đây (và thêm nó vào đường dẫn lớp trong trường hợp đó, v.v.).
Tôi cũng đã cố chỉ định Bundle-NativeCode: /foo.dll
.
Cũng quan tâm, đó là những đặc tính OSGi liên quan (mà tôi kéo lên bằng getprop
)
org.osgi.framework.os.name=WindowsXP
org.osgi.framework.processor=x86
Ngay cả sau khi tất cả điều này (và với mọi thử thách tôi thực hiện) Tôi luôn luôn kết thúc với các lỗi sau (và ngăn xếp ngăn xếp không được hiển thị):
java.lang.UnsatisfiedLinkError: Unable to load library 'foo': The specified module could not be found.
... vậy tôi còn thiếu gì?
Chỉnh sửa: Tôi cũng nên lưu ý rằng tôi đã thử nghiệm và đã thành công mã giao diện JNA và DLL mà nó nói đến như là một phần của chương trình Kiểm tra JUnit.
Chỉnh sửa 2: Thêm mã này vào lớp đang gọi thư viện dường như cho phép JNA tìm thư viện (khi gọi Native.loadLibrary
được gọi sau). Có vẻ như tôi sẽ có thể tránh cuộc gọi này dựa trên chỉ thị Bundle-NativeCode trong Tệp kê khai. Rõ ràng một khi thư viện được tải Native.loadLibrary lấy ví dụ hiện tại của nó, nhưng tôi không muốn phụ thuộc vào chiến thuật này rất cụ thể theo thứ tự.
static{
System.loadLibrary("foo");
}
Bạn đang sử dụng cài đặt OSGi nào? – omerkudat
Tôi đang sử dụng Equinox (đặc tả R4) –
Bạn có thể muốn nêu rõ phiên bản Java nào bạn đang sử dụng vì tôi chưa bao giờ gặp JNA trước đây và nó không phải là một phần của Java và bao gồm 6. – SteveD