【问题标题】:Does -Djava.library.path work on UNIX JVMs?-Djava.library.path 是否适用于 UNIX JVM?
【发布时间】:2013-04-12 18:10:48
【问题描述】:

我有一个 Java 应用程序,它依赖于一些用 C 编写的遗留代码,它通过 JNI 访问这些代码。原生库存储在一个子目录中(实际上有两个子目录:一个是 32 位库,一个是 64 位库)。

在 Windows 中,以下命令行形式可以正常工作:

java -Djava.library.path=nativelib64 -classpath myapp.jar;jni_lib.jar MyApplication

但是 AIX 和 Linux 上的等效项(基本上将类路径中的分号替换为冒号)因 UnsatisfiedLinkErrors 而失败 - 我不得不在调用之前显式设置 LIBPATH 或 LD_LIBRARY_PATH,因为我没有已经尝试将 -Djava.library.path 设置为(例如“nativelib64”、“./nativelib64”、“/full/path/to/myappdir/nativelib64”)似乎有效。

JVM 的 UNIX 版本不支持从命令行设置 java.library.path 属性吗?

【问题讨论】:

  • 什么样的java变量在起作用?
  • 您的原生库是否依赖于位于同一子目录中的其他共享库?
  • @Andreas 是的,确实如此,您的评论提醒我,当 ULE 试图从一个本地库链接到另一个库时,它似乎正在发生。我猜这是问题所在的线索:-)
  • 完全正确 - 可执行加载器仍然需要找到依赖的共享库,它通过 LD_LIBRARY_PATH 完成。见kalblogs.blogspot.co.uk/2009/01/java.html

标签: java linux java-native-interface aix


【解决方案1】:

http://kalblogs.blogspot.co.uk/2009/01/java.html:

java.library.path 仅用于解析您在代码中加载的 立即 本机库。

如果此直接库依赖于其他库(在java.library.path 定义的同一路径中,或在不同位置),则这些其他库将通过操作系统的标准机制加载。在这种情况下,还需要相应地设置LD_LIBRARY_PATH

【讨论】:

    【解决方案2】:

    您需要使用“LD_LIBRARY_PATH”变量。

    LD_LIBRARY_PATH:本机代码库(在 Linux 上,除了 此变量的值,查找路径通常包含 /usr/local/lib、/usr/lib、/lib 和其他一些)。 LD的名字来了 来自动态加载器,将库加载到的系统组件 动态链接的可执行文件。

    编辑:

    查看此链接:http://www.chilkatsoft.com/java-loadLibrary-Linux.asp

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2015-07-13
      相关资源
      最近更新 更多