mSensorList = (Sensor const**)malloc(count * sizeof(Sensor*));上面代码首先通过SensorDevice::getInstance()创建对象dev,调用dev.getSensorList(&list)获得传感器列表,将取出的sensor_t类型list传感器列表,塑造了HardwareSensor对象,传递给了registerSensor方法,通过registerSensor注册传感器,然后通过单例模型创建了SensorFusion对象,创建并注册了一系列的虚拟传感器,疑惑,极大的疑惑,怎么传感器还有虚拟的??
device/qcom/msm7627a/libsensors/SensorBase.hdevice/qcom/msm7627a/libsensors/AccSensor.cppdevice/qcom/msm7627a/libsensors/ProximitySensor.cppdevice/qcom/msm7627a/libsensors/LightSensor.cppdevice/qcom/msm7627a/libsensors/TmdSensor.cppdevice/qcom/msm7627a/libsensors/MagnetoSensor.cppdevice/qcom/msm7627a/libsensors/GyroSensor.cpp。P-Sensor:sensors_poll_context_t *dev = new sensors_poll_context_t();
Android之传感器系统(Gsensor)Sensor sensor = mSensorManager.getDefaultSensor(Sensor.调用了sensors_module_init()和sensors_module_get_next_sensor()两个本地JNI方法;源码在SystemServer.java中,在这里系统会new一个SensorService,SensorService中会调用JNI方法_sensors_control_init,对应com_android_server_SersorService.cpp中的android_init();这个主要是初始化SensorDevice的句柄供以后调用;
重要信息是它的一个成员结构变量中包含的一个函数指针open,该指针所指函数会对一个device结构变量赋值,从而带出sensorService.cpp 和sensorManager.cpp与sensor通信所需要的全部信息。其中主要是一些函数指针指向与sensor通信的函数。sensorService.cpp和sensorManager.cpp在得到HAL_MODULE_INFO_SYM结构后都会调用 sensors.h的inline函数open()通过HAL_MODULE_INFO_SYM的open函数指针将所需的device信息取回。
Android sensors移植文档。sensor_info_t sensors[] = {CONFIG_SENSORS_LIS3DH=y.sensor.default.so通过Ioctl控制sensor driver的状态,通过打开sensor driver对应的设备文件读取G-sensor采集的数据。有时gsensor会出现转屏不正常,这可能是sensor上报的数据的有问题,在sensor的datasheet中有说明,sensor在板子上的放置方式会影响到sensor三轴数据的正负,驱动中要根据sensor在板子上的放置方式和上层的数据要求确定数据的方向。
Sensor service在后台和driver交互获取数据,各个应用连上service获取想要的sensor数据,从如上代码看,没有任何和service交互的代码,这一切都被封装到SensorManager里了。我们之前描述的三个父类的功能中已经有过描述,ISensorServer定义了client和sensor service的RPC通信接口,client端在得到sensor service代理对象后,通过调用createSensorEventConnection与sensorservice建立connection,先看service端的实现代码:
Camera.cpp里调用了模板类里的connect函数,这个函数的实现在CameraBase.cpp里spTCam> CameraBaseTCam, TCamTraits>::connect(int cameraId, const String16& clientPackageName, int clientUid){ ALOGV(''%s: connect'', __FUNCTION__);//把所有的TCam替换成Camera,构造了一个Camera对象。
手把手教你当微信运动第一名 – 利用Android Hook进行微信运动作弊 | WooYun知识库。之前我们在Hacking Team事件中也亲眼目睹了利用hook技术来获取微信语音消息的android木马,所以一定要增加针对hook的检测才行。此文只是介绍了Android Hook的简单场景应用,关于Android Hook的原理以及更多的利用方式,比如说调试,关键API拦截,外挂等技巧,敬请期待WooYun Book系列的文章《安卓动态调试七种武器之离别钩 - Hooking》。
深入理解Android Sensor系统 (4.0)得到一个SensorManager,用来管理分配调度处理Sensor的工作,注意它并不服务运行于后台,真正属于Sensor的系统服务是SensorService,终端下#service list可以看到sensorservice: [android.gui.SensorServer]。当然还有各种千奇百怪的传感器,可以查阅Android官网API或者源码Sensor.java。建立一个Sensor对象,可查阅官网API android.hardware.Sensor.sensors_module_get_next_sensor();
HAL可以在open动作中完成初始化,如检测系统中存在的Sensor,保存每个Sensor的信息,维护一个所有的Sensor的列表。HAL初始化后,Service即可调用get_sensors_list获取系统所支持的所有Sensor。一句话总结,与HAL建立联系(动态链接),HAL初始化(open),获取Sensor信息(get_sensors_list)。Service与HAL层属于同一个进程,Service调用HAL层的函数,HAL找到对应的文件节点,根据不同的目的写入不同的值来触发驱动的操作。
在Java层Sensor的数据控制由SensorManager来负责,它的java代码和JNI代码分别位于:frameworks/base/core/java/android/hardware/SensorManager.javaframeworks/base/core/jni/android_hardware_SensorManager.cpp。android SDK提供了4个类来于sensor通信,分别为 sensor,sensorEvent,sensorEventListener,sensorManager.其中 sensorEventListener用来在sensorManager中注册需要监听的sensor类型。
Sensor sensor = new Sensor();调用JNI函数sensors_module_get_next_sensor()获取Sensor,并存在sHandleToSensor列表中。createSensorEventConnection()方法,该在服务端被实现,在客户端被调用,并返回一个SensorEventConnection的实例,创建连接,客户端拿到SensorEventConnection实例之后,可以对sensor进行通信操作,仅仅作为通信的接口而已,它并没有用来传送Sensor数据,因为Sensor数据量比较打,IBind实现比较困难。
在通过IBind通信,就可以获取到Sensor列表,所以在客户端初始化的时候,做了两件事情: n 获取SensorService实例引用 n 获取Sensor传感器列表 创建消息队列 当客户端第一次注册监听器的时候,就需要创建一个消息队列,也就是说,android在目前的实现中,只创建了一个消息队列,一个消息队列中有一个管道,用于服务端与客户断传送Sensor数据。fds[1]就是对应mSendFd,是管道的写端,sensor数据写入端,是sensor的服务进程访问的一端。
if (mFreeSpace) { const ssize_t nread = read(fd, mHead, mFreeSpace * sizeof(input_event));struct input_event* const mBufferEnd;ssize_t InputEventCircularReader::readEvent(input_event const** events){ *events = mCurr;Sensor服务端每次读取数据之后,当然,一次读取一组sensor数据,这一组sensor数据可能有几个sensor值,也可能一个都没有。ssize_t BitTube::write(void const* vaddr, size_t size){ ssize_t err, len;
深入理解Android系统第一弹。系统在内核空间初始化进程,内存,文件系统,驱动模块之后,调用init_post()函数,开启第一个用户进程init,进入用户空间。/kernel/init/main.c (仅截取部分重要代码)[plain] view plaincopyprint?static noinline int init_post(void) { run_init_process("/sbin/init"); run_init_process("/etc/init"); run_init_process("/bin/init"); run_init_process("/bin/sh"); }
Android的NDK开发(5)————Android JNI层实现文件的read、wri...int close(int fd)} int file_write(int fd, const unsigned char *buf, int size) { return write(fd, buf, size);} jint Java_com_conowen_fs_FsActivity_NativeFileWrite(JNIEnv* env, jobject thiz,int fd,jbyteArray buf,jint size){ unsigned char *buf_char = (char*)((*env)->GetByteArrayElements(env,buf, NULL));
2.调用到jni层:[cpp] view plaincopystatic void android_hardware_Camera_setPreviewDisplay(JNIEnv *env, jobject thiz, jobject jSurface) { ALOGV("setPreviewDisplay"); sp camera = get_native_camera(env, thiz, NULL);//这里是拿到一个和CameraService通信的客户端。[cpp] view plaincopysp Camera::connect(int cameraId) { ALOGV("connect");sp c = new Camera();
4) void curl_easy_cleanup(CURL *curl);HttpPostModule.cpp[cpp] view plain copy #include "HttpPostModule.h" HttpPostModule::HttpPostModule() : m_pCurl(NULL) { m_pCurl = curl_easy_init();[cpp] view plain copy #include <sys/stat.h> #include <unistd.h> #include "DownloadModule.h" DownLoadModule::DownLoadModule() : m_pCurl(NULL) { m_pCurl = curl_easy_init();
SOAP_FMAC3 int SOAP_FMAC4soap_out_SOAP_ENV__Header(struct soap *soap, const char *tag, int id, conststruct SOAP_ENV__Header *a, const char *type)if(soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a,SOAP_TYPE_SOAP_ENV__Header), type))SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(structsoap *soap, const char *tag, struct SOAP_ENV__Header *a, const char *type)
Sensor Service。Sensor Service has a fancy fusion instance which could generate virtual sensors event data.Once hardware not supplies such virtual sensors, Sensor Service uses its own virtual sensors.It is used to inform the BatteryService that how much time the sensor running. noteStartSensor() is called when enabling a sensor while noteStopSensor() is called when disabling a sensor.
mediaserver的main函数中调用了CameraService的instantiate函数来创建实例,该函数的实现在其父类BinderService中实现。第20行.通过hw_get_module函数加载了一个hw_module_t模块,这个模块是与hal层对接的接口,ID为CAMERA_HARDWARE_MODULE_ID,并将它保存在mModule成员变量中。id:CAMERA_HARDWARE_MODULE_ID,2.当frameworks层调用mModule->get_number_of_cameras函数时,实际就是调用上面结构体的get_number_of_cameras函数。
接着在构造函数里。它调用了HAL层的sensors_data_open函数,而这个函数位于sensor.h中,它调用的是。第一次mThread为null,然后它调用了service.getDataChannel()函数,此函数在SensorService类中,主要调用了jni函数_sensors_control_open(),当调用wake()函数时,会使SensorManager类线程的run()函数中的sensor_data_poll()函数立即返回,此时在run()函数中调用sensors_data_close();最终会调用HAL层的data_close()函数。
Java到c的访问,通过JNI(Java Native Interface),一般情况下的考虑是Java -> c,也有c -> Java的情形,这在Android中经常使用。Java中调用android.hardware.Camera::getCameraInfo()会调到cpp中的android_hardware_Camera_getCameraInfo (JNIEnv *env, jobject thiz,jint cameraId, jobject info_obj)c域中创建Java域里的对象是上节c域访问Java域的方法的特例,创建Java域的对象就是创建Java类的实例,再调用Java类的构造方法。
5、NDK环境基本上已经搭建好,新建一个普通Android项目测试NDK支持。问题一:Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml (这个是NDK工具的一个BUG,若build Target大于minSdkVersion,则会报这个错误,导致无法运行)解决方法:android-ndk-r8e/build/core/add-application.mk第128行把__ndk_warning改为__ndk_info;
Android系统进程Zygote启动过程的源代码分析。} } ...... } ...... } 每一个service命令都会促使init进程调用fork函数来创建一个新的进程,在新的进程里面,会分析里面的socket选项,对于每一个socket选项,都会通过create_socket函数来在/dev/socket目录下创建一个文件,在这个场景中,这个文件便是zygote了,然后得到的文件描述符通过publish_socket函数写入到环境变量中去:
cpp关于const和函数核心提示:cpp关于const和函数教程。如果采用"按址传递方式"的函数返回值加const 修饰,那么函数返回值(即地址)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。const int fun2(){ //按值传递 //最好直接写int fun2()   return num;  }public: R():num1(1){} int sum1(int a)const { // num1=10;
android jni 学习笔记 JNI是Java NativeInterface的缩写,译为Java本地接口。// static 函数中调用 android System.loadLibrary() 来调用 .so 库,// loadLibrary()会判断 .so库的类型,如果是jni库,则会调用 .so库中的 JNI_OnLoad()函数来注册jni interface.// TestInternalApi.cpp// JNI interface class, JNI_OnLoad()函数在.so被load的时候调用// JNI interface function中可以调用底层的 C++/C函数控制硬件等。
Android Sensor.头文件路径:hardware/libhardware/include/hardware/sensors.h.int (*get_sensors_list) (struct sensors_module_t *module, struct sensor_t const**list);在这里还有两个是sensors_control_device_t和sensors_data_device_t两个结构体,其中都是些函数指针的定义;在这里要提醒一下,我们在驱动代码中取到的sensor寄存器中的值并不一定是我们实际要上报给应用的值,比如g-sensor,则各个方向则不应该大于10。
2. 当frameworks层调用mModule->get_number_of_cameras函数时,实际就是调用上面结构体的get_number_of_cameras函数CamDeviceManagerImp gCamDeviceManager;ICamDeviceManager*getCamDeviceManager(){ return &gCamDeviceManager;}staticintget_number_of_cameras(void){ return NSCam::getCamDeviceManager()->getNumberOfDevices();}1. 这里先通过getCamDeviceManager函数获取了CamDeviceManagerImp对象。