【问题标题】:Use windows static libraries from java code with minimal effort (prefereably using JNA)从 java 代码中轻松使用 windows 静态库(最好使用 JNA)
【发布时间】:2010-10-25 02:33:09
【问题描述】:

我必须使用 java 代码中的一些静态 windows 库 (*.lib),我可以编写 C++ JNI 包装器,但我宁愿不这样做(没有 C++ 经验)。

使用它的最简单(最少的开发工作量)方式是什么,性能并不重要,因为该代码只会获取一些数据,很可能会在 JAVA 端进行处理。

我很可能会使用JNA,但 AFAIK 它需要动态库,而我有静态库。

我还 asked question 关于将静态库转换为动态库。

【问题讨论】:

    标签: java java-native-interface shared-libraries native jna


    【解决方案1】:

    您始终可以创建一个直接调用静态库的 DLL(动态库)项目,然后您可以将 JNA 与新创建的 DLL 一起使用。

    【讨论】:

    • 是的,我可以,但我更喜欢直接从 java 调用整个东西。 . .这将使我能够更快地进行实验。我使用的库是一堆一堆函数,所以写一个完整的包装器不是一个选项,一点一点做也会很痛苦。
    • 我不建议使用 JNI,因此无需在 wrapper 中编写复杂的东西。事实上,这很容易 - 在头文件中的每个函数前加上 _declspec(dllexport)(这可以通过编辑器的搜索替换简单地完成)并构建为 DLL 项目,然后它应该给你一个 DLL。
    • @jb 你能发回你的经验吗?
    • 这里是另一个与之相关的问题,它包含一个简单的应用程序,它采用头文件并围绕它生成动态包装器:stackoverflow.com/questions/845183/…
    【解决方案2】:

    不管怎样,我不久前就有过这样的项目。自动生成 JNI 包装器非常容易。我认为我们有大约 350 个函数导出要包装。我们花了大约 3 个小时来编写一个脚本来自动生成包装器(抱歉,手边没有脚本,否则我会发布它)。

    我们自己几乎没有编写 C++ 代码 - 但它确实需要了解 JNI 的工作原理......这实际上是一个很好的学习机会/项目 - 如果你有时间,不要害怕 JNI - 你会惊讶于您对 JVM 工作原理的了解之多……

    如果你真的走这条路,我建议你保持你的包装函数真的非常轻量级——实际上根本没有处理它们。只需将必要的参数从 JNI 值转换为本地参数(这主要用于字符串),调用您的本地函数,然后将结果转换回来。

    如果您有一个函数传入一个字符串指针并希望该字符串在指针中返回,请使用 Java 端的大小为 1 的字符串数组,并使用本机调用的结果填充它。

    或者,如果您时间紧迫,请将您的 .lib 编译为 .dll 并使用 JNA :-)

    【讨论】:

      猜你喜欢
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多