【问题标题】:Use static C++ library in Eclipse for Java在 Eclipse for Java 中使用静态 C++ 库
【发布时间】:2016-06-17 06:15:37
【问题描述】:

我想在我的 Java 程序中使用现有的静态 C++ 库。我读了that it should be possible。步骤将(几乎)相同as for linking dynamic libraries。不幸的是,如果我尝试使用以下内容加载库:

static { 
    System.loadLibrary("mylibrary");    
}

我得到一个例外:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no mylibrary in java.library.path

我尝试在 System.loadLibrary 调用之前手动设置 java.library.path,但没有帮助:

System.setProperty("java.library.path", "/workspace/LibraryTest/lib/");

在项目的运行配置中设置LD_LIBRARY_PATH 也不能解决问题。我犯了同样的错误。但是对于共享库,它可以正常工作。目前我在 Debian Jessie 上的 Eclipse Mars 中使用 Oracle Java8。图书馆是否需要 JNI_OnLoad_mylibrary 方法?有人遇到过类似的问题吗?

编辑

尝试了 /usr/lib 目录并添加了JNI_OnLoad_mylibrary。没有成功。

【问题讨论】:

  • 这个问题之前已经回答过了,很好,在这里:stackoverflow.com/questions/24493337/…
  • 那是我已经在我的问题中链接的帖子。我知道它必须是可能的,但它不起作用。也许我错过了什么?

标签: java c++ eclipse java-native-interface static-libraries


【解决方案1】:

也许您的代码不可重定位?这似乎可能会扰乱 JVM。使用-fPIC 重新编译,看看会发生什么。

从另一个问题的答案中,您需要在二进制文件中定义 JNI_OnLoad_name-of-your-library 才能使其正常工作。 C++ 名称修改毁了你的一天吗?您可能需要 extern "C" 该函数才能被 JVM 找到。

【讨论】:

  • 我更新了库并为 JNI_OnLoad_mylibrary(UnLoad)方法添加了 extern 关键字。还使用 -fPIC 编译了库。编译期间没有错误。如果我从 C++ 调用它,该库运行良好。但是 Eclipse 仍然告诉我“java.library.path 中没有 mylibrary”。可以肯定的是,如果静态库文件名为 libmylibrary.a,则将方法命名为 JNI_OnLoad_mylibrary 就足够了?
  • 我可以在上一条评论中回答这个问题:是的,将方法命名为 JNI_OnLoad_mylibrary 就足够了。至少这是 JNI 文档所说的。然而,主要问题仍然存在,即找不到静态库。任何想法或提示都非常感谢。
  • 您可以将静态库编译为共享库并使用它:stackoverflow.com/questions/655163/… 除此之外,我几乎没有想法。你在做什么应该工作。也许您为错误的拱门编译了库?位错?使用过您没有的处理器扩展?
  • 目前我正在从静态库中创建一个共享库。遗憾的是,我没有时间检查所有可能的问题......我想我将来会更详细地研究这个问题。如果我找到解决方案,我会在这里发布。
  • 抱歉,我帮不上忙。 JNI 对一大堆不同的事情非常挑剔,当事情出错时,它通常不会给出好的错误。你经常会陷入“检查所有的事情!”
猜你喜欢
  • 2018-10-31
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 2011-06-24
  • 2012-09-22
相关资源
最近更新 更多