JNI,使用两个.so文件(其中一个需要另一个)时出错

时间:2018-09-26 01:14:23

标签: java c++ tomcat java-native-interface shared-libraries

我有两个.so文件-A.soB.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.soB.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 :(得分:0)

唯一的解决方案可能是:

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

答案 1 :(得分:0)

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