我继承了一个遗留的 J++ 项目。我已成功将此项目升级到标准 Sun Java。

然而,该项目包含一个本机 C++ dll,Java 代码通过 Microsoft 特定的 RNI框架.

不用说,调用 System.loadLibrary("myRniNativeDll") 现在会抛出 UnsatisifiedLinkError,表示无法找到依赖项之一。

我完全不知道如何将 C++ RNI dll 迁移到 JNI dll;我不知道从哪里开始。我有 C++ 源代码,但我不知道如何构建 JNI dll。 Java 专家是否可以向我提供任何提示/教程/在线材料?

有帮助吗?

解决方案

如果许可是可接受的(LGPL), Java Native Access 提供的FFI比JNI做了;移植可以减少剥离RNI层并暴露一个简单的'C'可调用API。

其他提示

看一眼 JNA - 或许可以通过这种方式直接访问 RNI DLL;或者至少它会使移植工作比手动执行 JNI 容易得多。

如果可能,我建议您考虑避免使用RNI - > JNI通过在纯Java中重写C ++代码来移植问题。

编写JNI代码需要大量的注意,如果你弄错了,JVM的稳定性就会受到威胁。我的建议是尽可能避免它。

虽然我从未使用过Microsoft的RNI,但只使用了Sun的JNI,我希望你不能直接使用RNI风格的DLL,就像它是一个JNI风格的DLL一样。我也没有意识到会自动转换或将RNI桥接到JNI的任何事情。

你没有提到你是否拥有C ++ RNI DLL的源代码,尽管我会假设你提到继承该项目。如果您有任何C ++ / C经验,并且非常了解RNI DLL提供的功能,那么将其移动到JNI应该不会太困难。移植它所花费的时间可能会有助于保持它向前发展。

您在维基百科上提供给JNI条目的链接提供了许多有关编码的有用链接与JNI。没有更多细节,很难提供任何其他建议。

Java Native Interface:程序员指南和规范是我最好的资源已找到编写JNI代码。它不包括RNI - > JNI,但它是学习JNI如何工作的一个很好的起点。

*它实际上非常干燥,读起来不是特别有趣,但它是我能找到的最好的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top