Java中的本机方法是否特定于操作系统?

Java中的本机方法是否特定于操作系统?,java,string,operating-system,native,Java,String,Operating System,Native,问题描述:-在一次讨论中,我发现程序员陷入了困境,我想我应该把它放到论坛上 今天我正在搜索数组转换为字符数组。我检查了string类的toCharArray()方法的定义 char str[] = "native".toCharArray(); toCharArray()定义:- public char[] toCharArray() { char result[] = new char[count]; getChars(0, count, result, 0); re

问题描述:-在一次讨论中,我发现程序员陷入了困境,我想我应该把它放到论坛上

今天我正在搜索数组转换为字符数组。我检查了string类的toCharArray()方法的定义

char str[] = "native".toCharArray();
toCharArray()定义:-

public char[] toCharArray() {
    char result[] = new char[count];
    getChars(0, count, result, 0);
    return result;
}
public void getChars(int srcBegin,int srcEnd,char dst[],int dstBegin){
   if(srcBegin<0){
       throw new StringIndexOutOfBoundsException(srcBegin);
   }
   if(srcEnd>count){
       throw new StringIndexOutOfBoundsException(srcEnd);
   }
   if(srcBegin>srcEnd){
       throw new StringIndexOutOfBoundsException(srcEnd-srcBegin);
   }
   System.arraycopy(value,offset+srcBegin,dst,dstBegin,srcEnd-srcBegin);
}
public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                         int length);
getChars定义:-

public char[] toCharArray() {
    char result[] = new char[count];
    getChars(0, count, result, 0);
    return result;
}
public void getChars(int srcBegin,int srcEnd,char dst[],int dstBegin){
   if(srcBegin<0){
       throw new StringIndexOutOfBoundsException(srcBegin);
   }
   if(srcEnd>count){
       throw new StringIndexOutOfBoundsException(srcEnd);
   }
   if(srcBegin>srcEnd){
       throw new StringIndexOutOfBoundsException(srcEnd-srcBegin);
   }
   System.arraycopy(value,offset+srcBegin,dst,dstBegin,srcEnd-srcBegin);
}
public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                         int length);

这里我不必理解本机,但我必须知道,在这样一个本机方法中,以同样的方式定义,不同的本机方法将为其他操作系统定义。它本机的原因是,使用本机代码可以大大优化这个代价高昂的函数


但是无论操作系统是什么,行为都是一样的。

因为Java语言的主要优点是跨硬件平台和操作系统的可移植性。因此,一个特定的方法,虽然声明为本机方法,但不应该为了遵循这个原则而更改您的签名,例如名称或参数


然而,可以改变的是本机方法的实现。此实现是特定于平台的。JNI提供了一种以独立于平台的方式使用任何本机方法的方法。

在可能的情况下,大多数操作都是独立于操作系统的

有一些明显的例外情况,例如Runtime.exec(String命令)将完全取决于您安装的命令

这将只创建操作系统允许的文件名。在Linux上,您可以使用在Windows中无效的字符。此外,Windows不区分大小写,这意味着如果您有另一个同名文件,忽略大小写,它将在Windows上覆盖,但在Linux中创建一个新文件

new FileOutputStream(String filename)

一个常见的问题是Linux允许您删除尚未关闭的文件,但windows不会。这可能会导致不同平台上的不同行为。

@shivquery您可以看到,当Java没有JIT(即时)优化和HotSpot JVM时,每一行字节码都需要解释然后执行。(如果您愿意,程序仍然可以以这种方式运行)。因此,由于Java的运行速度比本机代码慢得多,而且
System.arraycopy
是一种大型方法,因此他们决定将其改为
本机
。现在,Java程序的速度接近本机速度,因此无需将其设置为本机速度。但是,为了使方法定义相同,他们将其保留为
native