【问题标题】:Issue loading shared library in Java在 Java 中加载共享库的问题
【发布时间】:2016-10-26 15:38:09
【问题描述】:

我希望使用 JNI 制作基于 C++ 库的 java 实现。不幸的是,当我希望在 java 中使用共享库时,找不到它。这个共享库的问题在于它链接了另一个共享库。我有两种不同的情况,一种有效(但不应使用),另一种无效。

Ana 库必须始终是静态的。 Clara 库必须始终共享。当 Bob 库是静态的时它可以工作,但它应该是共享的,并且应该包括 Ana 和 Clara。

案例 1(工作并且可以加载到正确的 java.library.path 中)。

sharedlibJava.so 链接:staticlibAna.a staticlibBob.a sharedlibClara.so

案例 2(不起作用,因为即使 java.library.path 正确也无法加载它)。 sharedlibBob.so 链接:staticlibAna.a 和 sharedlibClara.so(基本的 c++ 实现已经过测试,可以正常工作)

sharedlibJava.so 链接:sharedlibBob.so(java 实现应该可以使用这个新的共享库)。

问题是,当我尝试加载库时,即使它位于正确的 java.library.path 中,它也找不到它。

非常感谢有关此问题的任何反馈。

【问题讨论】:

    标签: java linux windows java-native-interface shared-libraries


    【解决方案1】:

    将所有路径位置放在 LD_LIBRARY_PATH 上。或者,将它们放入 -Djava.library.path

    如果您已正确编译代码,我认为您在访问共享库时不会遇到问题。

    如果您将一个代码编译为共享库,然后通过将其他代码与共享库链接来引用它,它应该可以正常工作

    cc -g -shared -fpic c/recipeNo023_AnotherFunction.c -o lib/libAnotherFunction.$(EXT)
    cc -g -shared -fpic -I${JAVA_HOME}/include -I${JAVA_HOME}/include/$(ARCH) c/recipeNo023_HelloWorld.c -L./lib -lAnotherFunction -o lib/libHelloWorld.$(EXT)
    

    然后,您应该可以通过在 -Djava.library.path 中传递 lib 位置来调用代码

    java -Djava.library.path=:./lib -cp target recipeNo023.HelloWorld
    library: :./lib
    Hello world!
    Hello from another function!
    

    完整的示例代码请看这里:

    https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo023

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      相关资源
      最近更新 更多