Фактический дескриптор системного файла FileDescriptor (как int) в Android

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

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

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


person maciej    schedule 23.01.2010    source источник
comment
FileDescriptor исходит из java.io, а не из библиотеки Android.   -  person RickNotFred    schedule 23.01.2010


Ответы (1)


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

лучший выбор:

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

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

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

person Elliott Hughes    schedule 23.01.2010
comment
Спасибо за ответ, но на самом деле это мне не помогает :) Я прекрасно понимаю, что использование деталей внутренней реализации - это плохо, но в настоящее время у меня нет другого способа сделать это - все, что у меня есть, это FileDescriptor из-за того, как работает Android (он исходит от ContentResolver). Хотелось бы, чтобы я мог выполнять ввод-вывод на стороне Java, но, похоже, нет способа превратить FD в RandomAccessFile или его эквивалент — я могу сделать только односторонний InputStream из FD, но мне нужно использовать seek() в моем коде (пропустить ( ) не справляется). На данный момент я использовал FileDescriptor.descriptor (например, android_media_MediaPlayer.cpp), пока не появится лучший способ. - person maciej; 24.01.2010
comment
стоило бы зарегистрировать ошибку в базе данных ошибок Sun, что RandomAccessFile должен иметь конструктор, который принимает FileDescriptor, а затем зарегистрировать ошибку в базе данных ошибок Android, ссылаясь на ошибку Sun. - person Elliott Hughes; 25.01.2010