包装C/C++;Java内部

包装C/C++;Java内部,java,c++,eclipse,java-native-interface,Java,C++,Eclipse,Java Native Interface,我用C/C++开发应用程序。我比较精通这两种语言,喜欢做C++开发人员。我想知道如何创建一个java程序,包含所有C++代码。 我想把java C++中所有的C++代码包好。但是不知道怎么做 请在C++ java中集成C++的响应或方法/步骤。 (使用JNI是一种方式,但我无法在www上找到如何使用它) 仅供参考,我使用EclipseIDE进行开发 我在项目工作区中应该包括什么和什么包?< /p> < p>如果您想从java调用C++,则需要使用-java本地接口。 你会失去垃圾收集器的一些好处

我用C/C++开发应用程序。我比较精通这两种语言,喜欢做C++开发人员。我想知道如何创建一个java程序,包含所有C++代码。 我想把java C++中所有的C++代码包好。但是不知道怎么做

请在C++ java中集成C++的响应或方法/步骤。 (使用JNI是一种方式,但我无法在www上找到如何使用它)

仅供参考,我使用EclipseIDE进行开发


我在项目工作区中应该包括什么和什么包?< /p> < p>如果您想从java调用C++,则需要使用-java本地接口。 <警告>你会失去垃圾收集器的一些好处,因为它不能处理你的C++对象,而且你的代码将不再是可移植的。p>


也许你可以通过学习写100%个java而把C++放在后面,这只是一个建议。

JNI模块不是java类。这是C语言。使用JNI会受到很多限制,一些Java环境不支持JNI

没有支持的方式“在java类中包装C++代码”(Ed:我的意思是,没有JNI NOWAY,但JNI有问题)


<>你可以研究自定义C++编译器发出java字节码,但是没有人(包括我)会推荐这种方法。

< P>有很多教程可以做你想做的事情。例如,请查看:

使用JNI还有很多警告。我最近开始使用它(只是为了好玩,真的),它往往没有我最初预期的那么有趣

首先,您必须处理神秘代码,例如:

#include "test_Test.h"

JNIEXPORT jint JNICALL Java_test_Test_getDoubled(JNIEnv *env, jclass clz, jint n) {
    return n * 2;
}
其次,它倾向于淡化首先使用Java的一个主要原因:WORA(编写一次,在任何地方运行)。正如duffymo提到的,垃圾收集器也可能存在问题,但我认为,近年来,JVM在JNI集成方面变得相当聪明

这样说,为了把所有C++代码移植到JNI,你需要重构你的接口(甚至可以做一些内部体操)。这不是不可能的,但确实不推荐。理想的解决方案是用Java重新编写代码

也就是说,您还可以通过编程方式将代码从C/C++“转换”为Java,并且有很多这样的实用程序。但是,当然,机器比人笨,而且它们也必然会犯错误,这取决于类的复杂程度。

你不能“包装它”,你必须编写一些C/C++胶水


首先,我可以为您完成大部分工作。

我会避免使用JNI,因为它编写起来很乏味、冗长,而且非常痛苦。相反,我会使用JNA库,这使得编写本机集成变得非常简单

祝你好运。

就是专门为此而设计的(它得到了的支持,它将解析你的C/C++头并为你吐出Java绑定)


这是JNA的一个新的替代方案,它支持C++,

,而不是JNI,或者JNI,从像SWIG,甚至JNA的自动包装生成器中得到一些帮助,您可以考虑将C/C++和Java分离成不同的进程,并使用某种形式的IPC和/或Java的

进程
抽象来调用用C/C++编写的程序。这种方法放弃了“包装”,所以从某种意义上说,它不是这个问题的答案,但请在投票前继续阅读。我认为,在某些情况下,这是对更广泛问题的合理回答

采用这种方法的原因是,当您直接从Java调用C/C++时,JVM将面临本机代码出错的风险。风险在某种程度上取决于有多少本机代码是您的,有多少链接到第三方代码(以及您有多少权限访问此类第三方代码的源代码)

我遇到过这样一种情况:我不得不从Java调用一个C/C++库,而C/C++库中存在导致JVM崩溃的bug。我没有第三方源代码,因此无法修复本机代码中的错误。最终的解决方案是调用一个单独的C/C++程序,链接到第三方库。然后,Java应用程序在需要调用C/C++时调用许多短暂的本机进程

如果本机代码有问题,您可以使用Java进行恢复/重试。如果本机代码被包装并从JVM进程调用,它可能会破坏整个JVM

这种方法会影响性能/资源消耗,可能不适合您的应用程序,但在某些情况下值得考虑

拥有一个单独的应用程序来执行C/C++代码的功能,作为一个独立的实用程序和测试可能会很有用。而且,拥有一些干净的命令行或IPC接口可以简化将来与其他语言的集成


作为另一种选择,如果您喜欢并使用一个包装解决方案,可以进入减轻JVM过程完整性的风险。

可以通过JNI编写C++代码,但是没有从C++类到java类的直接映射。 我已经使用JNI修复了android SDK中发现的问题(特别是一个速度非常慢的FloatBuffer.put实现),我可能会在一些性能关键的领域使用它。我的建议是,尽量少用它,在一个隐蔽的地方,做一些对性能至关重要的事情,然后离开,如果可以的话,不要做任何内存分配。另外,不要忘记测量代码,看看它是否真的更快


出于兴趣,您开发的平台是什么?在轻java层中封装大量C++代码的唯一平台是Android——在其他平台上,只需编译C++,并完成它。转换每个C++类