I have JNI library libA.so, which depends on a C library libB.so.
In Java, one way to resolve “symbol lookup error” is to have:
class A{
public native void g();
static{
System.load("/asdfghjk/libA.so");
}
}
Then run the java program with
LD_PRELOAD=libB.so
However, this hack cannot be used in production system, for example when the program is deployed with Tomcat JSF.
The following “solution” doesn’t work:
class A{
public native void g();
static{
System.load("/asdfghjk/libB.so");
System.load("/asdfghjk/libA.so");
}
}
It produces an error:
symbol lookup error: /blah/... undefined symbol: _ZNblahblahblah...
That error is because it can’t find libraries which your shared library depends on.
You should either add the location of dependent libraries to your
java.library.path, explicitlySystem.loadthem first in the right order, or somehow use thedlopensystem call to load the dependencies.This question may be helpful: Java: load shared librariees with dependencies