2010-03-31 35 views
6

nềnĐang tải JNI lib trên Mac OS X?

Vì vậy, tôi đang cố gắng để tải một jnilib (đặc biệt JOGL) vào Java trên Mac OS X khi chạy. Tôi đã theo cùng những câu hỏi liên quan Stack Overflow:

Mục tiêu cuối cùng đối với tôi là để gói nền tảng file JOGL cụ thể vào một JAR và giải nén chúng vào thư mục tạm thời và tải chúng lúc khởi động. Tôi làm việc vấn đề của tôi lại chỉ đơn giản là cố gắng để tải JOGL sử dụng đường dẫn mã hóa cứng:

File f = new File("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl.jnilib"); 
    System.load(f.toString()); 
    f = new File ("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl_awt.jnilib"); 
    System.load(f.toString()); 

tôi nhận được ngoại lệ sau khi cố gắng sử dụng API JOGL:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no jogl in java.library.path 

Nhưng khi tôi chỉ định java.library.path bởi thêm tùy chọn JVM sau:

-Djava.library.path="/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/" 

Mọi thứ hoạt động tốt.


Câu hỏi

Có thể sử dụng System.load (hoặc một số biến thể khác) trên Mac OS X như một sự thay thế cho -Djava.library.path được viện dẫn khi chạy?

Trả lời

1

Jogl luôn cố gắng tự động tải tất cả thư viện phụ thuộc. Để tránh điều này, cần có lớp NativeLibLoader nơi bạn có thể gọi disableLoading() trước khi bạn tự tải thư viện qua System.load()

+0

Ngọt ngào! Cảm ơn điều này, gọi NativeLibLoader.disableLoading() trước khi tải các thư viện một cách thủ công một cách rực rỡ. – Clinton

-3

System.load(...) đặt tên thư viện làm đối số. Nó không có đường dẫn đến thư viện làm đối số. Tìm kiếm JVM cho thư viện có tên được chỉ định trong danh sách đường dẫn được chỉ định trong -Djava.library.path;

Ở đây không có gì cụ thể cho Mac OS X. Nó tìm kiếm thư viện theo cùng một cách trên tất cả hệ điều hành.

+2

thực sự sai, System.load() sẽ lấy tên tệp hoàn chỉnh và System.loadLibrary sẽ lấy tên lib – sreejith

+0

Tôi nghĩ rằng tải jnilib là mac cụ thể (nó là trong trường hợp của tôi). Tôi có nó làm việc trên Linux (.so), trong mac sau khi biên dịch jnilib không tải. Tôi sử dụng mvn jetty: deploy-war -Djava.library.path =/path/to/jnilib. Tôi thậm chí đã sử dụng System.setProperty ("mylib.systemclassloader", "false"); để nó chạy trong môi trường servlet (nó vô hiệu hóa việc tải tự động thư viện đó). Nguyên nhân có thể là gì? – Pramod

2

Bạn không phải cung cấp số java.library.path khi khởi động. Bạn có thể lập trình thiết lập nó với

System.setProperty("java.library.path", "/var/folder/bla/foo/bar/"); 

Tôi không biết nếu không System.load() sẽ hoạt động bằng cách nào đó mà không có đường dẫn thư viện này.

+1

Cảm ơn bạn đã đề xuất. Tuy nhiên trong kinh nghiệm của tôi thiết lập các 'java.library.path' tại thời gian chạy không có bất kỳ tác dụng.Tôi nghĩ rằng đây có thể là lý do tương tự như lý do tại sao bạn không thể thay đổi classpath tại thời gian chạy - http://stackoverflow.com/questions/271506/why-system-setproperty-cannot-change-the-classpath-at-run -time – Clinton

+0

Sau đó, bạn có thể đã có một vấn đề khác với một thư viện phụ thuộc. Thiết lập đường dẫn lib tại thời gian chạy hoạt động hoàn toàn tốt, tôi sử dụng để tải các thư viện của tôi giống như vậy. –

+0

Điều đó không hoàn toàn đúng, có một cách để buộc khởi tạo lại trình nạp lớp với lib.path mới. – Zorkus