3

似乎与 jni 一起工作将成为我几个月的日常工作。有没有一些工具可以简化处理混合 Java + C++ 项目的过程?

是否可以重新生成胶水 *.h 文件并自动重建本机库?或者我应该为 maven、ant、gradle、anything_else 写一些脚本?有没有经验?

4

4 回答 4

2

查看JavaCPP!我还在该页面上列出了其他解决方案......还有Jace在尝试从 C++ 中使用 Java 时很有用。

于 2012-06-10T11:45:58.497 回答
1

您可以使用SWIG自动生成胶水代码并使用 make 目标来重建本机库。您也可以将 ANT 的 c++ 任务用于相同目的。

于 2012-06-11T13:26:40.777 回答
1

你问的是经历。所以我的经验是,你应该从精心设计的需求、行为和对象生命周期开始。这应该会产生一个成熟的界面,在未来几乎不会改变。效果是您将需要很少更改胶水头文件,简单的一次 javah 就足够了。我知道这一切听起来都不是很敏捷,但是 JNI 只不过是一个快速的开发环境。

每天更改两次界面,添加和删除方法以及更改签名“只是为了看看它是否有帮助”是一条通往地狱的必经之路。在内存管理方面,您正在连接两个截然不同的世界,JVM 很容易感到紧张。线程安全又提升了一个层次。上面提到的辅助解决方案,虽然它们无疑是一个聪明的软件,但可能会让您错误地认为 JNI 很简单。然后 JVM 开始突然给你异常,你的对象将开始随机未初始化,等等......

于 2012-06-11T10:30:33.527 回答
1

几个月前,我遇到了同样的问题。看来Java/C++互操作刚刚复苏,你是先驱者之一。

如果您只是使用 Java 中的 C++ 对象,那么JNA可能是更好的解决方案。

如果您使用 C++ 中的 Java,我还没有遇到成熟的库。尽管功能相当完整,但JNI 是一个 C api(有意地,如果您阅读设计原理)。如果您要为其编写大量代码,我认为围绕它编写一个将裸露的jobject, jnienv, jclass... 句柄包装到显式资源中的 C++ 框架是值得的。

当 C++ 和 Java 必须使用回调等进行合作时,真正的问题就出现了......如果这是你的意图,请系好安全带......

于 2012-06-10T11:57:48.967 回答