当前位置: 首页 > 知识库问答 >
问题:

JavaWindows上的JNI和依赖库

寿元白
2023-03-14

长话短说:我有一个可执行的jar,它调用jni.dll,它依赖于lib.dll。我得到了非常可怕的不满意的LinkError

这个答案非常接近,但根据我的经验,它不能解决问题。即使在java.library.path中指定了dll所在的文件夹,它也不会工作。我还必须更改WindowsPATH环境变量。事实上,Windows上默认的java.library.path似乎是PATH

有什么“漂亮”的方法可以解决这个问题吗?我想为Windows构建一个安装程序,我想知道如何处理这个问题,这样最终用户就不必做任何手动工作。

编辑:

我实现了以下内容:该应用程序附带了一个名为“native\u libs”的文件夹,其中包含所有受支持体系结构的动态库。结构如下:

/
+- native_libs/
   +- windows/
   |  +- x86/
   |  |  +- ...
   |  +- x64/
   |     +- ...
   |
   +- linux/
   |  +- x86/
   |  |  +- ...
   |  +- x64/
   |     +- ...
   |
   +- libs/
      +- ...

在运行时,当应用程序初始化时,会检测到正确的JRE体系结构和系统操作系统,并将正确的库文件复制到libs/文件夹。java。图书馆路径也在运行时使用常见的hack设置。最后,使用本机启动器设置windows的PATH环境变量。

还有改进的余地吗?也许将dll复制到与jar文件相同的目录中可以消除设置java的需要。图书馆path和path变量?我需要研究用系统加载dll。load(),这将消除复制文件的需要。

共有3个答案

东门晟
2023-03-14

如果问题是操作系统找不到依赖项库,您是否尝试过通过系统加载它。loadLibrary()在加载主库之前?

徐高懿
2023-03-14

最简单的解决方案是确保所有。DLL位于“.”执行时。

鲜于玮
2023-03-14

<代码>java。图书馆路径指定系统所在的目录。loadLibrary()查找动态库文件。如果更改java。图书馆path系统属性,它不会产生任何影响。有一些黑客让Java“忘记”初始值并重新评估Java的内容。图书馆路径系统属性。

但是,依赖库不是由Java加载的,而是由Windows加载的。Windows不关心java。图书馆path,它只关心path环境变量。您唯一的选择是为Java进程调整路径。例如,如果从批处理文件启动,请在java调用之前更改环境变量。

 类似资料:
  • 问题内容: 我正在通过JNI运行一个库(我没有写过),并且在内部它调用了另一个DLL。除非我将另一个DLL的路径放在系统PATH变量上(我在Windows XP上),否则我会收到一条错误消息:“找不到依赖的库”。我希望能够在Java命令行上处理此问题,并且我已经尝试将其添加到- Djava.library.path和classpath中,但都没有起作用(我希望- Djava.library.pat

  • 我尝试了Hello world JNI,来自: http://home.pacifier.com/~mmead/jni/cs510ajp/ 我学习了Java类: 然后打电话进来: cpp文件如下所示: 我已切换到JDK x86并使用x86编译: 我使用了QT文件夹中的MINGW32的gcc(希望没问题) 注意:我必须添加共享,否则会出现错误: 请注意,我已经确保运行的是x32 jdk的java,并

  • 我收到这个错误消息 mylib。dll是一个JNI包装器,它使用其他C库。 当我打开mylib时。dll带有依赖项遍历器它显示所有依赖库都可用! 有没有办法检查java中找不到哪个库? 我用Visual Studio编译了第三方库,用mingw32编译了mylib。这可能是个问题吗?

  • 我想知道以下jar的所有传递依赖项: 将经典命令移动到pom。项目定义依赖关系和输入的xml: mvn依赖:树 将显示: 我没看到魔咒父母: 乍一看,mvn命令似乎可以显示非pom类型的依赖项。 有没有一种方法可以精确地显示使jar保持活动状态所需的每个文件? 谢谢

  • 在阅读了很多关于这个问题的文章之后,并遵循了这个非常有用的帖子:在npmpackage.json文件中,依赖关系、devDependence和peerDependence之间有什么区别? 我知道依赖项应该引用每个运行时libs,devdependency引用每个对开发依赖项有用的libs。 但是我现在很困惑。对于生产使用,我将不得不我的Angular应用程序。如果我做了,我甚至不能用编译。我需要,

  • 假设我有。它取决于。现在我的Java应用程序调用。 下面的文件夹布局工作吗? “第一级”: 使用JVM属性定位。 “第二级”: 这是正确的吗? 如果将设置为,我认为它可以覆盖对的搜索。但是它是否也包括对的搜索? 从这里看来,我对两个层次的猜测得到了证实:如何在Eclipse启动时将本机库添加到“java.library.path”(而不是重写它) 参见凯文·克莱恩的评论。但是使用环境变量的上述解决