2010-02-02 3 views
3

У меня есть аргумент с моим боссом, который убежден, что JVM использует JNI для доступа к родным вещам, таким как файловая система. Я думаю, что он ошибается, потому что сам JVM является родным кодом, и он напрямую связывается с ОС - для доступа к файловой системе не нужен шаблон JNI.Как JVM-доступ к файловой системе

Пожалуйста, помогите мне уточнить, как виртуальная машина работает

+1

Оказалось, что это такое JNI: JNIEXPORT аннулируются JNICALL Java_java_io_FileOutputStream_openAppend (JNIEnv * окр, jobject это, jstring путь) { FileOpen (окр, это, путь, fos_fd, O_WRONLY | O_CREAT | O_APPEND); } – Roskoto

ответ

4

Это действительно спорный вопрос. Ядровые интерфейсы Java - это языковая функция, позволяющая вам определить вызов функции в Java, который будет передан в код, который не является java, в частности, является родным для платформы. Если вы посмотрите на FileOutputStream.java в src.zip вашего SDK, вы увидите подобный коду:

/** 
* 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; 

Так что я хотел бы сказать, если вопрос - это библиотека классов использовать то же обозначение Я делаю для доступа к внешним вызовам библиотеки на системном уровне. Думаю, ответ будет да.

Однако виртуальная машина Java, которая интерпретирует java-байт-код и применяет эти правила, определенно является внутренним кодом - я подозреваю, что ради именования (разные «родные» системы используют совершенно разные API-интерфейсы), в отличие от обычных вызовов, эти вызовы захватываются виртуальной машиной и обрабатываются виртуальной машиной.

+1

Я думаю, что «родное» ключевое слово dosen't обязательно означает JNI http://java.sun.com/docs/glossary.html#N native Ключевое слово Java, которое используется в объявлениях методов, чтобы указать, что метод не реализован в том же исходном файле Java, а на другом языке. – Roskoto

+0

Aaaah спасибо. Я предполагаю, что бит, который делает его JNI, является вызовом System.loadLibrary(). – 2010-02-02 20:01:04

+0

@ Roskoto: Но если вы посмотрите исходный код JVM (по крайней мере, Sun), вы увидите, что большинство, если не все собственные методы в библиотеке классов, фактически реализованы с использованием JNI. Почему VM должна использовать другую технологию для реализации необходимых функциональных возможностей в библиотечных классах? – jarnbjo

2

JNI для Java коды для доступа к родному коду. Вы правы, JVM IS Native code, поэтому он напрямую привязан к платформе, для которой он скомпилирован. Вот почему для каждой операционной системы существует JVM. JVM для Windows скомпилирован для Windows, Linux для Linux, OSX для OSX и т. Д. У них есть все специфичные для платформы коды, испеченные в самом коде JVM.

+0

Да, но нет волшебства. Когда объект File или FileInputStream должен получить доступ к собственной файловой системе, они используют JNI для этого. Даже такие вещи, как java.lang.Class, используют JNI, чтобы добраться до кишок JVM. JVM обеспечивает собственные реализации байт-кодов Java, но в значительной степени все остальное, что требует собственных сервисов, - это вызов JNI. – PSpeed

+0

PSpeed, каков окончательный способ рассказать? Как насчет родных ключевых слов, которые упоминал Нинефингер? – Roskoto

+0

@PSpeed: Вы технически верны, но практически неверны. Программисту, использующему JVM, не нужно внедрять JNI для использования средств O/S, для которых JVM предоставляет API. Разница заключается в том, нужно ли вам писать собственную разделяемую библиотеку для каждого O/S и/или распространять ее (например, при использовании стороннего пакета, который использует JNI). –

Смежные вопросы