0

我正在编写一个 Scala 程序,它使用通过 JNA 加载的 C++ 共享对象来调用我们用 C++ 编写的一些自定义文件读取函数,并且不希望维护 Java/Scala 副本。该程序只需要与 Linux 兼容。

我的问题是,检查共享对象是否以编程方式可用的适当方法是什么?如果用户忘记将共享对象添加到他们的 LD_LIBRARY_PATH,那么当他们尝试使用其中的某些功能时,GUI 将会崩溃。我想在启动时进行检查以确保共享对象可用 - 我可以尝试进行读取然后捕获任何错误,但这需要读取文件并且感觉不对方法来做到这一点。

有任何想法吗?非常感谢。

4

2 回答 2

2

如果您通过 JNA 加载,那么如果 JNA 找不到库或由于缺少依赖项而无法加载它,您可以依靠 JNA 抛出 UnsatisfiedLinkError 。

System.loadLibrary并且System.load取决于java.library.path,它或多或少是从 JNA 初始化的,LD_LIBRARY_PATH并且与 JNA 的不同jna.library.path(JNA 可以通过该变量动态引导以搜索更多位置)。

于 2012-09-21T11:05:50.927 回答
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)
[...]
于 2012-09-21T09:42:43.613 回答