有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JNI的意义是什么?

我是Java新手,被告知使用Java本机接口来运行我用C编写的一些代码

现在,这可能是一个愚蠢的问题,但JNI的意义是什么?难道我不能简单地从一个JavaUI程序执行我的进程并得到它的stdout来解析吗

此外,我还了解到使用JNI可能会导致安全问题。这些问题是否直接取决于所调用代码的质量?或者这是更深层次的问题

谢谢


共 (3) 个答案

  1. # 1 楼答案

    Can't I simply execute my process from a Java UI program and get its stdout to parse ?

    您认为每当您想要执行任何本机代码时,启动一个新进程总是合适的吗?您真的想在进程之间传输潜在的大量数据吗?(想象一下本机图像转换。)

    Also, I've read that the use of JNI might cause security issues. Do these issues directly depend on the quality of the invoked code?

    对。基本上,本机代码的安全性比JVM中运行的Java要低。如果代码存在安全漏洞(例如缓冲区溢出),那么很明显,这将影响整个应用程序的安全性

    我应该说,Java开发人员很少需要担心JNI,在我的职业生涯中,我肯定只接触过几次JNI。如果需要,您可能还想查看SWIG

  2. # 2 楼答案

    what's the point of the JNI ?

    它使您能够在同一进程中混合使用C和Java代码

    Can't I simply execute my process from a Java UI program and get its stdout to parse ?

    使用JNI可以实现的许多事情也可以通过使用进程间通信(IPC)来实现。但是,您必须将所有输入数据发送到另一个进程,然后将所有结果发送回。这可能非常昂贵,这使得IPC在许多可以使用JNI的情况下(例如包装现有的C库)是不切实际的

    Also, I've read that the use of JNI might cause security issues. Do these issues directly depend on the quality of the invoked code ? Or is this something deeper ?

    这里的要点是,JVM做了大量工作,以确保无论抛出什么Java代码,都不会发生缓冲区溢出、堆栈破坏攻击等情况。例如,它对所有数组访问执行边界检查(C没有)

    另一方面,JNI代码是JVM的黑盒。如果C代码有问题(例如缓冲区溢出),则所有赌注均无效

  3. # 3 楼答案

    Can't I simply execute my process from a Java UI program and get its stdout to parse ?

    那要看你叫什么了

    注意,您不能仅仅通过JNI调用程序,而是调用库代码

    除此之外,生成新流程的成本相对较高,管理多个流程也比较复杂