Android 开发,使用ndk调用v4l2来读取Android摄像头的数据靠谱吗 android 6.0 ndk 支持camera吗

作者&投稿:休鱼 (若有异议请与网页底部的电邮联系)
  一、用NDK进行C代码的调取(已熟悉此调取技术)
  二、摄像头的获取,这个不能用SDK来调,因为用SDK来调头部跟踪程序很难获得我们的
  数据,也不大能考虑AIDL跨进程通信的方案,因为这样数据交互可能太慢。

  问题:

  头部跟踪移植到Android系统中,跟踪程序需通过核心程序(C实现)调取Camera而不是通过Android SDK进行调取Camera。

  前提:

  Android的四个层次如下,

  一个完成的Android应用,一般都是有Java框架的,虽然NDK(Native Development Kit,一系列工具的集合)提供了一系列的工具,帮助开发者快速开发 C (或 C++ )的动态库,并能自动将 so 和 java 应用一起打包成 apk 。但是NDK 并没有提供各种系统事件处理支持,也没有提供应用程序生命周期维护。此外,在本次发布的 NDK 中,应用程序 UI 方面的 API 也没有提供。至少目前来说,使用纯 C 、 C++ 开发一个完整应用的条件还不完备。所以,就目前来说,必须依赖上层Java框架的支持。

  解决方案:

  初步考虑有三种方式可以实现:

  一、由于Android是运行在Linux上的,所以可以考虑让C程序调V4L2
  接口来获取摄像头数据。Video4linux2(简称V4L2),是linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video0下。,不过可移植性差,因为不同厂家的设备驱动接口可能不完全一样,另外也要求开发者熟悉Linux内核编译。

  二、SDK获取摄像头数据,再用JNI调C来处理图像,也就是使用JNI来调取跟踪程序并进行数据交互。

  三、通过查看Android系统的底层代码,发现Android系统调摄像头也是通过JNI编程来实现的,所以考虑到是否能在JNI调用的Android底层Camera的底层流程中增加一步添加自己的业务逻辑。具体表现在调取Camera之前先启动头像识别程序,让头像识别程序去调Camera设备并获得进行数据交互,比如可以考虑在人像识别中调取android_hardware_Camera.cpp。Camera进程机制如下图:

  在Android中,Camera的代码主要在以下的目录中:
  Camera的JAVA程序的路径:packages/apps/Camera/src/com/android/camera/
  在其中Camera.java是主要实现的文件
  Camera的JAVA本地调用部分(JNI):
  frameworks/base/core/jni/android_hardware_Camera.cpp

  这部分内容编译成为目标是libandroid_runtime.so

  。
  Camera底层库在以下的目录中:
  frameworks/base/libs/ui/
  这部分的内容被编译成库libui.so。

  Camera服务部分:
  frameworks/base/camera/libcameraservice/
  这部分内容被编译成库libcameraservice.so。

  为了实现一个具体功能的Camera,在最底层还需要一个硬件相关的Camer库(例如通过调用video for linux驱动程序和Jpeg编码程序实现)。这个库将被Camera的服务库libcameraservice.so调用。

  在 Camera系统的各个库中,libui.so位于核心的位置,它对上层的提供的接口主要是Camera类,类 libandroid_runtime.so通过调用Camera类提供对JAVA的接口,并且实现了android.hardware.camera 类。 libcameraservice.so是Camera的服务器程序,它通过继承libui.so的类实现服务器的功能,并且与libui.so中的另外一部分内容则通过进程间通讯(即Binder机制)的方式进行通讯。
  libandroid_runtime.so和libui.so两个库是公用的,其中除了Camera还有其他方面的功能。

  特别说明:Camera在模拟器上无法运行,以上所述方案暂时不能做测试,而且底层调取Camera属于系统开发和嵌入开发的范畴,需要的知识面比较广,我也只是在初步研究中,以上所述,如有错误,还请批评指正及包涵。

android开发,怎么使用ndk编译成.so文件~

一、首先下载android-ndk,官方网站是:http://developer.android.com/tools/sdk/ndk/index.html
目前最新的版本是android-ndk-r8e-windows-x86.zip,下载地址:
http://dl.google.com/android/ndk/android-ndk-r8e-windows-x86.zip
下载后把压缩包解压出来,例如:D:
dk,目录下的ndk-build.cmd就是用来编译的批处理命令。
二、编译,打开cmd命令行窗口,cd进入目录:D:
dk\samples\hello-jni,
然后执行命令:D:
dk
dk-build.cmd(如果设置过环境变量则直接使用ndk-build.cmd)来编译hello-jni,如果没有错误会输出:
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
"Compile thumb : hello-jni <= hello-jni.c
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
三、创建android应用程序并使用so文件
打开eclipse创建一个android应用程序HelloJni,默认的com.example.hellojni包下面有一个MainActivity.java,
在此包下添加一个HelloJni.java,

1.2.2 燃油和润滑油的选择
燃油的选用必须符合本车规定的牌号,禁止使用低牌号的燃油,否则发动机工作时会产生爆震,使机件受到强烈的冲击和使零部件的附加载荷增加,从而加速机件的磨损。因爆震产生的高温、高压及冲击波还会破坏气缸壁上的润滑油膜,恶化机件的润滑。试验表明,某发动机在有爆震和无爆震下各工作200 h,经测定有爆震时气缸上部平均磨损量是无爆震的2倍多。另外,含杂质超标的燃油,同样会加速机件的磨损和腐蚀。