JNI,在一个需要另一个的地方使用两个 .so 文件时出错

JNI, error when using two .so files where one needs the other

我有两个 .so 文件 - A.soB.so,其中 A.so 需要 B.so.

我用System.setProperty("java.library.path","thePath");

然后我检查 System.out.println(System.getProperty("java.library.path"));

然后我使用 System.load("/absolutePath/A.so");

加载 A.so

A.soB.so 在同一目录中。

我得到的错误是 B.so can not find.

我不能使用LD_LIBRARY_PATH

ldd A.so 显示 B.so => ./B.so

我也用System.loadLibrary("A");但是错误是A can not find.

唯一的解决办法可能是:

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})

java.library.path 仅用于直接从 Java 加载的库。依赖库只有在操作系统本身可以找到它们的情况下才会被发现。 如果您不能使用 LD_LIBRARY_PATH 并且 B 不在系统搜索路径中,则必须在 A 之前显式加载 B 及其绝对路径。然后操作系统会在进程内存中找到它。