2010-01-23 3 views
3

Есть ли способ получить дескриптор системного файла (сокет или номер файла как int) из объекта FileDescriptor от Android? Я хотел бы получить доступ к файловому дескриптору непосредственно в коде JNI без использования каких-либо Java-оберток.Фактический дескриптор файлового файла FileDescriptor (как int) в Android

Edit: Я нашел getParcelFileDescriptorFD и FileDescriptor имеет ИНТ поле с именем «дескриптор», пример использования в media/jni/android_media_MediaPlayer.cpp, определение функ находится в frameworks/base/core/jni/android_util_Binder.cpp, поле само по себе в libcore/luni/src/main/java/java/io/FileDescriptor.java

Но это не является частью официальной документированный API. Есть ли документальный «правильный» способ сделать это?

+0

FileDescriptor исходит из java.io, а не из библиотеки андроидов. – RickNotFred

ответ

5

собственный код в dalvik/libcore/ использует jniGetFDFromFileDescriptor в java_io_FileDescriptor.c, но вы не должны называть его самим, потому что это нестабильный API. вы можете скопировать & вставьте этот код, но вы действительно хотите дважды подумать, прежде чем делать это. использование JNI для доступа к деталям реализации - это просто попрошайничество, чтобы ваш код был случайно сломан в будущем!

лучше выбрать:

  1. держать ввода/вывода на стороне Java, если вы можете.

  2. если вы должны сделать I/O на родной стороне (как и в случае медиаплеера) держать ввода/вывода на родной стороне: вызов открытой (2) или что-то на той стороне , сохраните fd как int, а не messing с объектом FileDescriptor, и если вы передадите что-либо обратно в Java, передайте int или ваш собственный объект (без намерения использовать его для чего-либо, кроме передачи обратно на ваш собственный код).

эти два варианта работают сегодня и не могут быть случайно повреждены изменениями в деталях реализации Android, которые вы не контролируете.

+0

Спасибо за ответ, но это мне действительно не помогает :) Я прекрасно понимаю, что использование внутренних данных реализации плохо, но у меня нет другого способа сделать это в настоящее время - все, что у меня есть, это FileDescriptor из-за того, как Android работает (это от ContentResolver). Мне хотелось бы сделать I/O на стороне Java, но, похоже, нет никакого способа превратить FD в RandomAccessFile или его эквивалент - я могу сделать только односторонний InputStream из FD, но мне нужно использовать seek() в моем коде (skip() не выполняет эту работу). Я пошел с FileDescriptor.descriptor на данный момент (например, android_media_MediaPlayer.cpp), пока не будет лучшего способа. – maciej

+0

было бы опасно зарегистрировать ошибку в базе данных Sun's, в которой RandomAccessFile должен иметь конструктор, который принимает FileDescriptor, а затем регистрирует ошибку в базе данных ошибок Android, ссылаясь на ошибку Sun. –

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