使用JNI时如何摆脱LD_PRELOAD

时间:2012-12-19 12:08:39

标签: java java-native-interface

我有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...

1 个答案:

答案 0 :(得分:3)

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

您应该将依赖库的位置添加到java.library.path,先按正确的顺序显式System.load,或以某种方式使用dlopen系统调用来加载依赖项。< / p>

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