我有 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...
最佳答案
该错误是因为它找不到您的共享库所依赖的库。
您应该将依赖库的位置添加到您的java.library.path
中,首先以正确的顺序显式地System.load
它们,或者以某种方式使用dlopen
系统调用来加载依赖项。
这个问题可能会有所帮助:Java: load shared librariees with dependencies
关于java - 使用 JNI 时如何摆脱 LD_PRELOAD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13952189/