所以,我正在寻找另一个答案,我注意到 ObjectInputStream.java 中的这两个方法( bytesToFloats 和 bytesToDoubles )。
/**
* 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/