3

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

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

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

我还了关于将静态库转换为动态库的问题。

4

2 回答 2

3

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

于 2009-05-10T11:53:53.233 回答
2

对于它的价值,我前一段时间有一个这样的项目。自动生成 JNI 包装器非常容易。我想我们有大约 350 个函数导出要包装。我们花了大约 3 个小时来编写一个脚本来自动生成包装器(对不起,手边没有脚本,否则我会发布它)。

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

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

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

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

于 2009-05-10T21:54:28.970 回答