2010-02-02 2 views
3

JVM이 JNI를 사용하여 파일 시스템과 같은 원시 파일에 액세스한다고 확신하는 내 상사와 논쟁이 있습니다. JVM 자체가 원시 코드이고 OS와 직접 통신하기 때문에 JNI 보일러 플레이트가 파일 시스템에 액세스 할 필요가 없기 때문에 자신이 잘못했다고 생각합니다.JVM이 파일 시스템에 액세스하는 방법

하면 JVM이

+1

은 그것은 JNI 무엇인지 밝혀졌다 : JNIEXPORT 무효 JNICALL Java_java_io_FileOutputStream_openAppend (JNIEnv의 * ENV,하는 jobject이, jstring으로 경로) { 제공 FileOpen (| O_CREAT | ENV이, 경로, fos_fd, O_WRONLY O_APPEND); } – Roskoto

답변

4

이것은 실제로 논점이 아닙니다. Java Native Interfaces는 Java에서 함수 호출을 정의 할 수있게 해주는 언어 기능입니다.이 함수 호출은 Java가 아닌 특히 플랫폼 고유의 코드로 전달됩니다. 문제가있는 경우

/** 
* Opens a file, with the specified name, for writing. 
* @param name name of file to be opened 
*/ 
private native void open(String name) throws FileNotFoundException; 

/** 
* Opens a file, with the specified name, for appending. 
* @param name name of file to be opened 
*/ 
private native void openAppend(String name) throws FileNotFoundException; 

/** 
* Writes the specified byte to this file output stream. Implements 
* the <code>write</code> method of <code>OutputStream</code>. 
* 
* @param  b the byte to be written. 
* @exception IOException if an I/O error occurs. 
*/ 
public native void write(int b) throws IOException; 

그래서 내가 말할 것 - 클래스 라이브러리는 같은 표기법을 사용합니까 : 당신이 당신의 SDK의 src.zip에서 FileOutputStream.java를 보는 경우에, 당신은 다음과 같은 코드를 볼 수 있습니다 외부 시스템 수준의 라이브러리 호출에 액세스하려면 어떻게해야합니까?

그러나 자바 가상 머신은 자바 바이트 코드를 해석하고 이러한 규칙을 적용하는 것은 명백히 네이티브 코드입니다. 라이브러리에 대한 네이티브 호출과 달리 네이밍 (다른 "네이티브"시스템은 전혀 다른 API를 사용합니다) 이러한 호출은 VM에 의해 선택되고 VM에 의해 처리됩니다.

+1

"기본"키워드가 필요하지 않음을 의미합니다. JNI http://java.sun.com/docs/glossary.html#N 네이티브 메소드 선언에 사용되어 메소드를 지정하는 Java 키워드 동일한 Java 소스 파일에 구현되어 있지 않고 다른 언어로 구현되어 있습니다. – Roskoto

+0

감사합니다. 나는 JNI가 System.loadLibrary() 호출 인 것을 생각한다. –

+0

@Roskoto : 그러나 JVM 소스 코드 (적어도 Sun의 것)를 살펴보면 클래스 라이브러리의 모든 네이티브 메소드가 실제로는 JNI를 사용하여 실제로 구현된다는 것을 알 수 있습니다. VM이 라이브러리 클래스에서 필요한 기본 기능을 구현하기 위해 다른 기술을 사용해야하는 이유는 무엇입니까? – jarnbjo

2

JNI 네이티브 코드에 액세스하는 자바 코드입니다 어떻게 작동하는지 저를 명확하게 도와주세요. JVM IS 네이티브 코드이므로 컴파일 된 플랫폼에 직접 연결됩니다. 이것이 각 운영 체제에 JVM이있는 이유입니다. Windows JVM은 Windows, Linux 용 Linux, OSX 용 OSX 등으로 컴파일됩니다. JVM 코드 자체에 구워진 모든 플랫폼 특정 코드가 있습니다.

+0

네,하지만 마법은 없습니다. File 객체 또는 FileInputStream이 원시 파일 시스템에 액세스해야하는 경우 JNI를 사용하여 수행합니다. java.lang.Class와 같은 것조차도 JNI를 사용하여 JVM의 보물을 얻습니다. JVM은 Java 바이트 코드의 네이티브 구현을 제공하지만 네이티브 서비스를 필요로하는 기타 모든 것들은 JNI 호출입니다. – PSpeed

+0

PSpeed, 알 수있는 확실한 방법은 무엇입니까? Ninefingers가 언급 한 기본 키워드는 어떻습니까? – Roskoto

+0

@PSpeed ​​: 기술적으로 정확하지만 실제로는 올바르지 않습니다. JVM을 사용하는 프로그래머는 JVM이 API를 제공하는 O/S 기능을 사용하기 위해 JNI를 구현할 필요가 없습니다. 차이점은 각 O/S에 대한 네이티브 공유 라이브러리를 작성하고 배포해야하는지 여부입니다 (JNI를 사용하는 타사 패키지를 사용할 때와 마찬가지로). –

관련 문제