gpt4 book ai didi

java - 在 Java 中加载共享库的问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:49 24 4
gpt4 key购买 nike

我希望使用 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 中找到它,即使它位于那里。

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

最佳答案

将所有路径位置放在 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

关于java - 在 Java 中加载共享库的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40266528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com