Фактический системный файловый дескриптор FileDescriptor (как int) в Android - PullRequest
3 голосов
/ 23 января 2010

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

Edit: Я обнаружил, что 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. Есть ли документированный «правильный» способ сделать это?

1 Ответ

5 голосов
/ 24 января 2010

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

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

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

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

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

...