2

我有 JNI 库 libA.so,它依赖于 C 库 libB.so。

在 Java 中,解决“符号查找错误”的一种方法是:

class A{
    public native void g();
    static{
        System.load("/asdfghjk/libA.so");
    }
}

然后运行java程序

LD_PRELOAD=libB.so

但是,这种 hack 不能在生产系统中使用,例如当程序使用 Tomcat JSF 部署时。

以下“解决方案”不起作用:

class A{
    public native void g();
    static{
        System.load("/asdfghjk/libB.so");
        System.load("/asdfghjk/libA.so");
    }
}

它产生一个错误:

symbol lookup error: /blah/... undefined symbol: _ZNblahblahblah...
4

1 回答 1

3

该错误是因为它找不到您的共享库所依赖的库。

您应该将依赖库的位置添加到您的,以正确的顺序首先java.library.path明确地添加它们,或者以某种方式使用系统调用来加载依赖项。System.loaddlopen

这个问题可能会有所帮助:Java: load shared library with dependencies

于 2012-12-19T12:14:12.030 回答