Java中的本机方法是否特定于操作系统?
问题描述:-在一次讨论中,我发现程序员陷入了困境,我想我应该把它放到论坛上 今天我正在搜索数组转换为字符数组。我检查了string类的toCharArray()方法的定义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
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
。