【问题标题】:JNI, error when using two .so files where one needs the otherJNI,使用两个需要另一个的.so文件时出错
【发布时间】:2018-09-26 01:14:22
【问题描述】:

我有两个.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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      唯一的解决办法可能是:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-29
        • 2021-09-28
        • 1970-01-01
        • 2021-10-29
        • 2012-08-08
        • 2015-12-13
        相关资源
        最近更新 更多