Я хочу вызвать некоторую функцию из liba.so из другого libb.so.
libb.so является динамической, поэтому библиотека, которая реализует собственный метод, который я загрузил, используя System.loadLibrary ("b") внутри JNI. Сначала я установил полный путь для обоих .so внутри jni, используя java.library.path, но когда я запускаю свои java-программы, загружая общую библиотеку libb.so,
это дает ниже ошибку:
Exception in thread "main" java.lang.UnsatisfiedLinkError: x/y/z/libb.so: liba.so: cannot open shared object file: No such file or directory.
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
сначала я связал общую библиотеку liba.so с другой общей библиотекой libb.so во время компиляции, используя
g ++ -shared -o libb.so -fPIC b.cc -L / x / y / z -la
(скажем, полный путь к liba.so - / x / y / z)
В JNI я установил прагматически java.library.path, который содержит полный путь к liba.so, libb.so, и затем я использовал для загрузки собственной библиотеки JNI libb.so как
(скажем, полный путь к libb.so - это / b / c и
полный путь к liba.so равен x / y / z.)
String libpath = "x/y/z" + "a/b/c";
System.setProperty( "java.library.path", libpath);
try {
Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
}
catch (Exception e)
{
System.out.println(e);
}
// здесь я могу напечатать / получить правильный файл java.library.path. (путь к обеим совместно используемым библиотекам правильно сохранен в java.library.path)
static {
System.loadLibrary("b");
}
когда мои java-программы загружают эту динамическую библиотеку статического блока, выдает ошибку ниже:
Исключение в потоке "main" java.lang.UnsatisfiedLinkError: x / y / z / liba.so: libb.so: невозможно открыть общий объектный файл: такого файла или каталога нет.
Примечание: когда я устанавливаю путь к liba.so в LD_LIBRARY_PATH, это работает без ошибок. но я не хочу устанавливать LD_LIBRARY_PATH в SHELL. просто я хочу установить java.library.path или LD_LIBRARY_PATH в самой программе.
Заранее спасибо!