Java 灵活的jni项目

Java 灵活的jni项目,java,c++,java-native-interface,Java,C++,Java Native Interface,在接下来的几个月里,与jni合作似乎将成为我的日常工作。有没有一些工具可以简化处理混合java + C++项目? 是否可以重新生成glue*.h文件并自动重建本机库?或者我应该为maven,ant,gradle写一些脚本,还有其他的吗? 有经验吗?退房!我还列出了该页面上的其他解决方案。。。在尝试从C++中使用java时,这也是有用的。 几个月前,我遇到了同样的问题。看起来Java/C++互操作刚刚开始复苏,您是其中的一个先驱 如果你只使用java中的C++对象,也许是一个更好的解决方案。p>

在接下来的几个月里,与jni合作似乎将成为我的日常工作。有没有一些工具可以简化处理混合java + C++项目? 是否可以重新生成glue*.h文件并自动重建本机库?或者我应该为maven,ant,gradle写一些脚本,还有其他的吗?
有经验吗?

退房!我还列出了该页面上的其他解决方案。。。在尝试从C++中使用java时,这也是有用的。

几个月前,我遇到了同样的问题。看起来Java/C++互操作刚刚开始复苏,您是其中的一个先驱

如果你只使用java中的C++对象,也许是一个更好的解决方案。p>

如果你使用C++的java,我还没有遇到一个成熟的库。尽管功能相当完整,JNI是一个C api(如果您阅读了设计原理,那么是有意的)。如果你要编写很多代码,我认为写一个C++框架将支付它的开销,它包括裸机<代码> Joojs<代码> > <代码> JNIENV ,<代码> JCype …将句柄转换为显式资源


当C++和java必须使用回调等协作时,会出现真正的问题。如果这是你的意图,请系好安全带…

你在询问一次体验。所以我的经验是,您应该从设计良好的需求、行为和对象生命周期开始。这将导致一个成熟的接口,它在未来几乎不会改变。其效果是,您很少需要更改glue头文件,简单的一次性javah就足够了。我知道这听起来不是很敏捷,但JNI绝对不是一个快速开发环境


每天更改两次界面、添加和删除方法以及更改签名“只是为了看看是否有用”,这无疑是一条通往地狱的道路。在内存管理方面,您连接了两个截然不同的世界,JVM很容易感到紧张。线程安全性又提高了一个级别。上面提到的助手解决方案,虽然它们无疑是一个聪明的软件,但可能会让您错误地认为JNI很容易。然后JVM开始不知从哪里给你异常,你的对象将开始随机非斜体化,等等。

你可以使用它自动生成粘合代码,并有一个make目标来重建本机库。你也可以使用蚂蚁的C++任务来实现同样的目的。p> 我读了一些关于SWIG的书,觉得它很有趣。但是它能够回调java吗?这取决于-但是对于一般情况,答案是肯定的-参见第5.4.9.段。如果它真的能做到这一点,SWIG将是最好的解决方案。你有这方面的经验吗?我几乎没有通过SWIG进行回调,所以我在这里的经验是无用的。我主要使用SWIG包装平台库代码。OtohJNA解决方案在您的情况下更简单,因为它意味着更少的开销。哇,真的这么糟糕吗?我对JNI的使用经验不多,就像您所说的那样:设计良好的可互操作界面,使用起来相当舒适,因为在本机代码中添加一些功能时,我所要做的就是在netbeans中按F11来重建它。但现在情况有点不同了。我试图找到一种好的界面设计方法。所以,我应该做一些实验来选择合适的方法。不管怎样,你能给我一些关于JNI的建议吗?我是否应该只保留一个本机算法片段,并从java中使用它进行规则化?或者我应该把所有特定的逻辑都保留在本机中吗?我没有说它不好,我说它不简单:)我的一般建议是只在本机中做在java中做不到的事情。每隔一段时间,进行一次正式的健全性检查:查找您正在使用的每个堆对象,并确保您知道谁以及何时分配和解除分配它。如果您的本机代码只泄漏了一点点,那么如果以本机运行,则实际上是可以容忍的。你甚至可能没有注意到。但是JVM有它自己的容忍度,并且会以难以理解和令人不快的方式告诉你。好吧,谢谢你的经验:)还有关于JNI的良好实践或捷径的书吗?或者只是每天的虫子战斗会带来经验?我已经放弃了。你可能认为它过时了(2002年),但JNI也没有改变。它帮助我解决了我遇到的所有问题:线程安全、本地/全局引用、静态初始值设定项等等。它非常有趣,因为我曾经为了自己的目的在jni上编写过一些包装器。。每个jni开发者最终都会有一个超级舒适的jni框架吗?@AlexPovar:我真的希望有人会在github上启动一个项目。(如果不是,我保证自己考虑:)如果它真的是实际的,可以在GITHUB上创建一个带有描述和空主(方法)和“社区做其余的=”的项目,请在编写更多的废话之前先检查JavaCpp和Jace。它看起来确实很有前途。你有JavaCPP在JVM中的对象和本地对象之间进行双向通信的经验吗?@xtofl当然,我是为JavaCV做的:)如果你有想要实现的“双向通信”的具体例子,请给我指出这个问题,我会看一看!