JNI依赖库

Jef*_*rey 15 java java-native-interface

我正在通过JNI运行一个库(我没有写它),并在内部调用另一个DLL.我得到一个错误说"找不到依赖库",除非我把另一个DLL的路径放在系统PATH变量上(我在Windows XP上).我希望能够在java命令行上处理这个问题,我已经尝试将它添加到-Djava.library.path并添加到类路径中,两者都没有用(我希望-Djava.library.path可以工作)但不是类路径,但都没有工作).有没有办法做到这一点?

谢谢,

杰夫

Viv*_*vek 19

  • 如果您有一个DLL名称'MyNativeDLL.dll',那么您应该在LoadLibrary调用中使用'MyNativeDLL'.
  • 使用Dependency Walker检查MyNativeDLL.dll是否需要任何文件
  • 如果有,请将它们包含在与MyNativeDLL.dll相同的文件夹中 - 一个让它工作的尝试将其他所需文件放在System32文件夹中.

  • 对 - 欢迎来到DLL地狱.在我们的例子中,我只加载A.dll,它在内部引用B.dll,所以B应该总是在A之后加载.我只是试图避免修改PATH变量. (2认同)

Lir*_*dav 6

通过在所有DLL上以反向依赖顺序使用System.load(),我能够在不将任何DLL放在PATH上的情况下工作.为了清楚起见,我在所有依赖DLL上调用System.load(),而不仅仅是JNI DLL.您不必在Windows附带的DLL上调用System.load()(它们位于PATH上).

我在一个Web应用程序中这样做,其中jar包含已解压缩的DLL.你的情况似乎更简单,所以我认为它应该有效.我一般遵循这里的解决方案:如何制作包含DLL文件的JAR文件?