我继承了遗留的J ++项目。我已成功将此项目升级到标准Sun Java。
但是,此项目包含一个本机C ++ DLL,Java代码通过特定于Microsoft的RNI framework与之对话。
毋庸置疑,调用System.loadLibrary(“myRniNativeDll”)现在会抛出一个UnsatisifiedLinkError,说无法找到其中一个依赖项。
我完全不知道如何将C ++ RNI dll迁移到JNI dll;我不知道从哪里开始。我有C ++源代码,但我不知道如何构建JNI DLL。 Java专家可以指出哪些提示/教程/在线资料?
答案 0 :(得分:3)
如果许可是可接受的(LGPL),Java Native Access提供了比JNI更友好的FFI;移植可以减少剥离RNI层并暴露一个简单的'C'可调用API。
答案 1 :(得分:3)
看一下JNA - 可以直接以这种方式访问RNI DLL;或者至少它会比手动操作JNI更容易移植它。
答案 2 :(得分:2)
如果可能,我建议您考虑避免使用RNI - > JNI通过在纯Java中重写C ++代码来移植问题。
编写JNI代码需要大量的注意,如果你弄错了,JVM的稳定性就会受到威胁。我的建议是尽可能避免它。
答案 3 :(得分:1)
虽然我从未使用过微软的RNI,只有Sun的JNI,我希望你不能直接使用RNI风格的DLL,就像它是一个JNI风格的DLL一样。我也没有意识到会自动转换或将RNI桥接到JNI的任何事情。
你没有提到你是否拥有C ++ RNI DLL的源代码,尽管我会假设你提到继承该项目。如果您有任何C ++ / C经验,并且非常了解RNI DLL提供的功能,那么将其移动到JNI应该不会太困难。移植它所花费的时间可能会有助于保持它向前发展。
您在Wikipedia上提供给JNI条目的链接有很多关于JNI编码的有用链接。没有更多细节,很难提供任何其他建议。
答案 4 :(得分:1)
Java Native Interface: Programmer's Guide and Specification是我发现编写JNI代码的最佳资源。它不包括RNI - > JNI,但它是学习JNI如何工作的一个很好的起点。
*它实际上非常干燥,读起来不是特别有趣,但它是我能找到的最好的。