2012-09-21 39 views
0

我正在編寫一個Scala程序,它使用通過JNA加載的C++共享對象來調用一些我們用C++編寫的自定義文件讀取函數,並且不希望維護Java /斯卡拉副本也是如此。該程序只需要與Linux兼容。Scala/Java JNA檢查sharedobject的可用性

我的問題是,什麼是適當的方法來檢查共享對象是否可用編程方式?如果用戶忘記將共享對象添加到他們的LD_LIBRARY_PATH中,那麼當GUI嘗試並使用其中的某些功能時,GUI將會崩潰。我希望在啓動時進行檢查以確保共享對象可用 - 我可以嘗試執行讀取操作,然後捕獲任何錯誤,但這需要從中讀取文件,而且感覺不像右邊那樣方法來做到這一點。

任何想法?非常感謝。

回答

1

如果你依靠在他們的路徑外部庫(而不是使用JNA JAR包裝功能)的人,你可以簡單地檢查使用System.loadLibrary

~ $ cat x.c 
int answer() { return 42; } 
~ $ gcc -shared -fPIC -o libx.so x.c 
~ $ scala 
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_21). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> System.loadLibrary("x") 

scala> System.loadLibrary("y") 
java.lang.UnsatisfiedLinkError: no y in java.library.path 
     at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734) 
     at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
[...] 
+0

謝謝你。我想知道是否有更好的方法去做,而不是嘗試它並發現錯誤,但似乎沒有 - 所以我會這麼做 – paulmdavies

2

如果您是通過加載JNA ,那麼你可以依靠JNA拋出一個UnsatisfiedLinkError,如果它找不到該庫或者由於缺少依賴關係而無法加載它。

System.loadLibrarySystem.load取決於java.library.path,這是更或lesss從LD_LIBRARY_PATH初始化並不太一樣東西JNA的jna.library.path(JNA可以動態經由可變涉及搜索更多的位置)。