3

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

但是,该项目包含一个本机 C++ dll,Java 代码通过 Microsoft 特定的RNI 框架与之对话。

不用说,现在调用 System.loadLibrary("myRniNativeDll") 会引发 UnsatisifiedLinkError,表示找不到其中一个依赖项。

我完全不知道如何将 C++ RNI dll 迁移到 JNI dll;我不知道从哪里开始。我有 C++ 源代码,但我不知道如何构建 JNI dll。Java 专家有什么技巧/教程/在线资料可以指点我吗?

4

5 回答 5

3

如果许可是可接受的 (LGPL),Java Native Access提供比 JNI 更友好的 FFI;移植可能会减少到剥离 RNI 层并仅公开一个简单的“C”可调用 API。

于 2009-09-15T21:04:10.580 回答
3

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

于 2009-09-15T21:06:55.240 回答
2

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

编写 JNI 代码需要非常小心,如果写错了,JVM 的稳定性就会受到威胁。我的建议是尽可能避免它。

于 2009-09-14T05:02:12.143 回答
1

虽然我从未使用过 Microsoft 的 RNI,只使用过 Sun 的 JNI,但我希望您不能直接使用 RNI 样式的 DLL,就好像它是 JNI 样式的 DLL。我也不知道任何会自动将 RNI 转换或桥接为 JNI 的东西。

你没有提到你是否有 C++ RNI DLL 的源代码,尽管我假设你有,因为你提到了继承项目。如果您有任何 C++/C 经验,并且对 RNI DLL 提供的功能有很好的了解,那么将其移至 JNI 应该不会太难。为移植它所花费的时间可能会为保持它向前发展而获得回报。

您在Wikipedia上提供的 JNI 条目链接有很多关于使用 JNI 进行编码的有用链接。没有更多细节,很难给出任何其他建议。

于 2009-09-14T05:07:58.117 回答
1

Java Native Interface: Programmer's Guide and Specification是我找到的用于编写 JNI 代码的最佳资源。它不包括 RNI -> JNI,但它是学习 JNI 如何工作的一个很好的起点。

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

于 2009-09-15T21:11:42.607 回答