【问题标题】:J++ to Java: how to migrate from RNI to JNI?J++ 到 Java:如何从 RNI 迁移到 JNI?
【发布时间】:2009-09-21 08:17:23
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java interop java-native-interface j++


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 如果RNI代码的功能可以用纯Java实现,我也推荐这个建议。
        • +1 表示纯 Java 版本。这很可能是不可能的,因为我猜它会粘在特定于 Windows 的东西中。
        • 不可能。 DLL 与自定义硬件对话,另外还公开了一些您无法在 Java 中本地访问的特定于 Windows 的功能。
        • 那你为什么投反对票?对 >>CONSIDER
        • 你是对的,我很抱歉,你不知道代码不能用纯 Java 重写。我已将我的投票改为赞成票。
        【解决方案4】:

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

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

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

        【讨论】:

        • 我有 C++ 源代码,谢谢。我对它在做什么有一个大致的了解。我只需要有关如何构建 JNI dll 的提示。
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-15
          • 1970-01-01
          • 1970-01-01
          • 2011-04-05
          • 2018-03-25
          • 1970-01-01
          • 2023-04-08
          • 1970-01-01
          相关资源
          最近更新 更多