В настоящее время я работаю над приложением OpenCV для камер с критическими требованиями к производительности
У нас уже есть реализации камеры на основе Java — оба, Устаревший HAL 1 а также API Camera2
Мы используем реализацию camera1 на платформах < 21 и реализация Camera 2 на платформах> = 21
Эти две реализации уже чрезвычайно оптимизированы для повышения производительности, однако мы считаем, что мы все еще можем улучшить их путем обновления до нового встроенного API-интерфейса камеры ndk (главное улучшение заключается в сокращении накладных расходов при передаче данных изображений JNI на собственный процессор OpenCV)
В версии Android 7.0 (API 24) была добавлена поддержка нативной камеры NDK. Однако единственная доступная документация NDK этот плоский список заголовков C
К сожалению, я в настоящее время запутался, потому что нет четкой информации о поддержке платформы родной камеры
Когда я посмотрел на нативный API, я заметил, что он очень похож на java camera2 API
Это заставляет меня (желательно) думать, что нативный API должен быть обратно совместим с более ранними платформами, которые поддерживают java API камеры2
Я начал экспериментальный проект в попытке разрушить миф, однако из-за отсутствия документации NDK прогресс идет медленно
Меня особенно интересует, пытался ли кто-нибудь еще использовать собственный API камеры, и есть соответствующий вывод по этому вопросу, которым можно поделиться
С другой стороны, мне также любопытно узнать, является ли собственная реализация API камеры обратной JNI-связью с Java2-камерой camera2 или это действительно интеграция более низкого уровня. Интересно также узнать, является ли Java-интерфейс camera2 JNI-привязкой к нативному API камеры?
Есть больше документации NDK, спасибо только заголовкам C; например, если вы нажмете на одну из функций, вы можете получить справочные документы.
Тем не менее, я думаю, что вы правы в том, что история совместимости недостаточно хорошо документирована.
Короткая версия, что если вы звоните ACameraManager_getCameraIdList и он возвращает идентификаторы камеры, затем вы можете открыть их с помощью API NDK.
Если он не возвращает идентификаторы, значит, на этом устройстве нет поддерживаемых камер.
Более длинная история заключается в том, что API NDK поддерживает только те камеры, которые имеют аппаратный уровень ОГРАНИЧЕНО или выше. Устройства LEGACY не поддерживаются.
Как примечание по оптимизации, как вы передаете данные через JNI? Хотя JNI не до смешного быстр, он не такой медленный и до тех пор, пока вы используете механизмы передачи, которые не копируют данные (например, прямой доступ к ByteBuffer через getDirectBufferAddress.
Других решений пока нет …