我目前正在开发一款基于摄像头的OpenCV应用,具有关键的性能要求
我们已经有基于java的相机实现 - the deprecated HAL 1和camera2 API
我们在平台上使用camera1实现< 21和平台上的Camera 2实现> = 21
这两个实现已经针对性能进行了极大的优化,但是,我们相信我们仍然可以通过升级到新的本机ndk相机API来改进(主要的改进是减少JNI图像数据传输到本机OpenCV处理器的开销)< / p>
在Android 7.0(API 24)版本中,引入了NDK本机摄像头支持。但是,唯一可用的NDK文档是this flat list of C headers
不幸的是,我目前感到困惑,因为没有关于原生相机平台支持的明确信息
当我查看本机API时,我注意到它与java camera2 API非常相似 这让我(如意)认为本机API应该与支持camera2 java API的早期平台向后兼容
我已经开始尝试破坏神话的实验项目,但由于普遍缺乏NDK文档,进展缓慢
我特别感兴趣的是,是否有其他人已经尝试过利用原生相机API,并且可以分享这个问题的相关结论
在另一条轨道上,我也很想知道相机原生API实现是否是与camera2 java API的反向JNI绑定,或者它是否确实是一个较低级别的集成。了解camera2 java API是否是与本机相机api绑定的JNI也很有趣?
答案 0 :(得分:3)
还有更多的NDK文档,感谢C标题;例如,如果单击其中一个函数,则可以获得reference docs。
但是,我认为你的纠正是因为兼容性故事没有充分记录。
简短版本是,如果您调用ACameraManager_getCameraIdList并返回摄像机ID,则可以使用NDK API打开它们。 如果它没有返回任何ID,则该设备上没有支持的摄像头。
较长的故事是NDK API仅支持hardware level有限或更高的相机设备。不支持LEGACY设备。
作为优化说明,您如何通过JNI传递数据?虽然JNI的速度并不快,但它并不那么慢,只要您使用不会复制数据的传递机制(例如通过{{3直接访问ByteBuffer) }}