JNI, ошибка при использовании двух .so файлов, где один нужен другому - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть два .so файла - A.so и B.so, где A.so нужно B.so.

Я использую System.setProperty("java.library.path","thePath");

и проверяю System.out.println(System.getProperty("java.library.path"));

Затем я загружаю A.so, используя System.load("/absolutePath/A.so");

A.so и B.so в одном каталоге.

Я получаю сообщение об ошибке: B.so can not find.

Я не могу использовать LD_LIBRARY_PATH.

ldd A.so показывает B.so => ./B.so

Я также использую System.loadLibrary("A");, но ошибка в том, что A can not find.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

java.library.path используется только для библиотек, загружаемых непосредственно из Java.Библиотеки зависимостей будут обнаружены только в том случае, если сама операционная система сможет их найти.Если вы не можете использовать LD_LIBRARY_PATH, а B отсутствует в системном пути поиска, вы должны явно загрузить B перед A с его абсолютным путем.Тогда операционная система найдет его в памяти процесса.

0 голосов
/ 26 сентября 2018

Единственное решение может быть следующим:

Пусть ldd показывает абсолютный путь.

Отредактируйте файл CMakeList.txt:

LINK_DIRECTORIES("/the/absolute/path/")

target_link_libraries(A B.so)

ОБНОВЛЕНИЕ:

Найдите способ, я приведу только пример файла cmake.

cmake_minimum_required(VERSION 3.12)
project(xgbtSimiCalcer)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -fpermissive -m64 -Wl,--no-as-needed -O3 -march=native")

SET(xgbtSimiCalcer_SRC test0.cpp ../test1.cpp)

INCLUDE_DIRECTORIES(./)
INCLUDE_DIRECTORIES(../)

SET(CMAKE_INSTALL_RPATH "\\$ORIGIN")
LINK_DIRECTORIES("${CMAKE_SOURCE_DIR}/../../model/")
LINK_LIBRARIES("${CMAKE_SOURCE_DIR}/../../test.so")
ADD_LIBRARY(xgbtSimiCalcer SHARED ${xgbtSimiCalcer_SRC})
TARGET_LINK_LIBRARIES(xgbtSimiCalcer m.so dl.so pthread.so)
SET(LIBRARY_OUTPUT_PATH "../../tmp")
SET(INSTALL_DIR "${CMAKE_SOURCE_DIR}/../../model_")
INSTALL(TARGETS xgbtSimiCalcer LIBRARY DESTINATION ${INSTALL_DIR})
...