java - 可以访问来自java运行时的 native void,就这样吗?

标签 java

所以,我正在寻找另一个答案,我注意到 ObjectInputStream.java 中的这两个方法( bytesToFloatsbytesToDoubles )。

/**
 * Converts specified span of bytes into float values.
 */
// REMIND: remove once hotspot inlines Float.intBitsToFloat
private static native void bytesToFloats(byte[] src, int srcpos,
                                         float[] dst, int dstpos,
                                         int nfloats);

/**
 * Converts specified span of bytes into double values.
 */
// REMIND: remove once hotspot inlines Double.longBitsToDouble
private static native void bytesToDoubles(byte[] src, int srcpos,
                                          double[] dst, int dstpos,
                                          int ndoubles);

一开始我很沮丧,因为它们是私有(private)的、本地的,我认为这在我的实验中已经结束了。然而,我在放弃之前做了一个实验,只是将这些方法定义复制到我自己正在尝试的类中,并且它起作用了。

所以我的问题是:为什么它有效?为什么可以从“任何地方”这样访问 native 方法,我希望在访问 native 方法时有一些守卫或门柱。

为了进一步澄清我的问题:我很好奇为什么可以从任何地方访问 java.io 的 native 方法,而无需任何指针确切访问的内容。对我来说,这有点像一个奇怪的 super 全局。

最佳答案

编译器“假设”您已提供 native 库。

class Ideone
{
    private static native void bytesToDoubles(byte[] src, int srcpos,
                                          double[] dst, int dstpos,
                                          int ndoubles);
    public static void main (String[] args) throws java.lang.Exception
    {
        byte[] bytes = { 1, 2, 3 ,4, 5, 6, 7, 8};
        double[] dst = new double[1];
        bytesToDoubles(bytes, 0, dst, 0, 1);
        System.out.println(dst[0]);
    }
}

通过这个答案,我们可以看到,当我们运行程序时,不会有原生库。

Exception in thread "main" java.lang.UnsatisfiedLinkError: >Ideone.bytesToDoubles([BI[DII)V
at Ideone.bytesToDoubles(Native Method)
at Ideone.main(Main.java:17)

因此,要访问另一个类 native 库,您需要使用完全限定的类名。因此,它将获得私有(private)提供的“保护”。

关于java - 可以访问来自java运行时的 native void,就这样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60114485/

相关文章:

java - 从数组创建 toString

java - 将 Map.Entry 对象与双变量进行比较

java - 接口(interface)的骨架实现中的抽象方法

java - 从数组创建二叉树

java - 防止tomcat在部署时启动应用程序

java - 添加 JMenuItems 的有效方法

bash 中的 Java 哈希函数

java - Maven Shade 包含 slf4j-log4j12,尽管已明确从 POM 中排除

Java,动态转换,将值从对象传递到目标类的对象

java - 递归和字符串相等函数的问题