最近开始熟悉android的开发,毕业实习的时候曾经接触过android的apk开发,一开始从整个框架的熟悉到具体某个模块的设计与实现,整个体会就是android系统是一个庞大的,互相交融的系统。虽单个模块的设计与模块化思想很优秀,但是还是设计到不用模块的互相交差。所以没法单纯的吃透某一个模块。
任务:
将平台提供的camera接口,实现apk层的调用,也就是说要实现framework层的部分逻辑,JNI的实现以及java层的接口的封装,基于原生camera的C/S架构,平台已经提供了类似此C/S模式的client端的接口,所以只需要实现多个client端并发的对server端的图像数据获取即可,当然还需要做一些预览,此处又设计到了surface的相关知识。
还是模仿了原生camera client端的设计,遇到的问题有如下,仅此记录:
JNI方法在注册的时候:
{ "initCamera", "()V", (void*)(Java_com_chinatsp_qcomcam_QcomCameraView_initCamera)},
initCamera一定要和java类中的native函数保持一样,一开始自己以为只是别名而已
如果在JNI层的其它自定义的函数,比如第三方回调的函数,在获取ENV的时候需要使用这样的方式:
jint res = g_vm->AttachCurrentThread(&env, NULL); //g_vm 可以在JNI_OnLoad()时保存全局对象
需要把JNI的env attach到当前的线程环境里面,此时的线程应该是第三方的线程,而非JNI的运行线程。