【问题标题】:How does Java standard libraries comunicate with native code?Java 标准库如何与本机代码通信?
【发布时间】:2010-07-15 01:04:18
【问题描述】:

他们是否使用 Mono 的 PInvoke 之类的东西?还是更像是在运行时启动之前注册的内部调用? java 是否有用于处理诸如 mscorlib.dll 之类的本机调用的基础库?如果我想在 C 代码中调用 JVM,它的库会查找 .so/.dll 文件吗?如果我静态链接所有 JRE 本机库,它会对 Java 标准库产生影响吗?

【问题讨论】:

    标签: java jvm java-native-interface jvm-hotspot


    【解决方案1】:

    他们完全按照公开记录的方式使用 JNI 来调用特定平台的本地共享库。

    就从 C 代码调用 JVM 而言,JVM 使用共享库(DLL、SO 等)。快速搜索 JDK 6 源代码并没有发现任何 System.loadLibrary() 对核心本机支持(如 Object、String 等中的本机方法)。这表明这些方法的本机代码,从 JRE/bin 目录的内容来看,似乎在 DLL 中,由 java.exe(和 Windows 中的 javaw.exe)显式链接。

    当我上次查看这些内容时,从 C 代码调用 JVM 的要求是 JNI 的一个有据可查的部分——我强烈建议您参考该文档以进一步进行。我们甚至成功地为 IBM AS/400 Java 1.1 JVM 编写了本机 C 包装器/加载器。

    【讨论】:

      【解决方案2】:

      他们使用 Java 本地接口 (JNI)。

      我从来没有从 C 调用过 JVM,所以我不知道。

      【讨论】:

        【解决方案3】:

        这里有一个关于如何从 C 程序内部启动 JVM 的示例:

        http://www.inonit.com/cygwin/jni/invocationApi/c.html

        【讨论】:

          【解决方案4】:

          Java Native Access (JNA) 使 Java 程序可以轻松访问本地共享库(Windows 上的 DLL),而无需编写 Java 代码”(引自其主页)。

          到目前为止,我个人从未尝试过。

          【讨论】:

            猜你喜欢
            • 2012-04-02
            • 1970-01-01
            • 2016-09-21
            • 2021-12-01
            • 2014-05-03
            • 2015-11-23
            • 2013-10-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多