J++ 到 Java:如何从RNI迁移到JNI?
-
07-07-2019 - |
题
我继承了一个遗留的 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如何工作的一个很好的起点。
*它实际上非常干燥,读起来不是特别有趣,但它是我能找到的最好的。