Загрузка зависимых .so из другой общей библиотеки через JNI - PullRequest
0 голосов
/ 26 января 2019

Я хочу вызвать некоторую функцию из 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)
  1. сначала я связал общую библиотеку liba.so с другой общей библиотекой libb.so во время компиляции, используя

    g ++ -shared -o libb.so -fPIC b.cc -L / x / y / z -la

    (скажем, полный путь к liba.so - / x / y / z)

  2. В 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 в самой программе.

Заранее спасибо!

...