今天晚上喝了杯咖啡,趁着兴奋的劲,一不小心找出了困扰好长时间的Bug
阶段1、两个进程通过位于共享内存中的互斥量来实现进程控制,但主进程从共享区获取了pthread_mutex_t后,准备用pthread_mutex_lock加锁的时候,程序卡住。
调试:使用gdb运行程序,当程序卡住后 --->执行 print pMutex->__data.__lock 返回 97xxxxxx,反正很大的一个数 ---> __lock 的值应该不是1就是0 表示是否被加锁两种状态,而且从返回的值来看一般是指针错误的引用了内存某块区域 --> 所以回到代码中查看最开始分配并返回 pthread_mutex_t 的地方,发现果然是返回的时候pthread_mutex_t 的起始地址让我计算错了(这里我搞了个共享内存池,所以要自己计算变量的起始地址)
这个问题算是解决了,下面是pthread_mutex_t 的结构
typedef union{
struct __pthread_mutex_s {
int __lock;
unsigned int __count;
/**此处省略好几个字**/
} __data;
char __size[__SIZEOF_PTHREAD_MUTEX_T];
long int __align;
} pthread_mutex_t;
实验室最近正在做一个基于嵌入式android系统的视频会议项目,我跟师兄负责视频采集一块,用的是v4l2+ffmpeg做视频采集和处理。
ubuntu下程序的测试运行,以及后来的编译、移植都搞定了,跑到我们的硬件box上,出现问题。打了Log后发现程序执行到 avio_open函数时报错。
1、开始,我们一直认为是编译和移植的问题,在这上面着实费了很大一阵功夫。
2、昨天晚上,师兄突然问我会不会是android 的权限问题,我们的avio_open最后是要在设备上创建文件的,这需不需要获取什么权限???或者说我们创建文件的区域位于非法区域????
开始测试: 使用gdb跟进代码
avio_open ---> ffur_open ---> ffurl_connect ---> uc->prot->urlopen(urlopen是个函数指针,运行时被赋值成了file_open,当然如果你用的是网络流那就不是了) ----> open (这是linux的基本API)
3、好了就是说avio_open 走到底层实际上就是要调用open函数在android设备上创建文件了。现在考虑两个问题:(1)创建文件需要什么权限?(2)我们创建文件的目录是否安全
问题1、权限问题:
<!--往sdcard中写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--在sdcard中创建/删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
问题2、创建文件的目录是否安全:
我们给avio_open()传入的文件路径是 “./hell.flv”,就是在当前目录,后来经过调试发现这里的当前目录其实是系统的根目录就是 “ / ”,显然这个目录不是我们能随便修改的,正确安全的目录应该是 ” /mnt/sdcard/“ ,
OK,其实整个问题就在于上面的 问题1、2 , 以后在android设备上创建文件一定要注意这两个问题
以前用的ffmpeg一直是0.x几的版本,今天老板让我用NDK重新编译下最新版本2.11的ffmpeg到android上,平台移植这过程没有错误怎么能体现它的牛X性,本人编译过程主要遇到了下面几个错误:
ffmpeg 2.0 + x264 0.14(2013-10月份新出的版本) 已经用NDK编译完成并成功移植到android平台。具体间我的博文:
2013年12月26
背景:
大师(boss绰号)要求修改android Settings apk,让我隐藏掉Backup & reset 下的 PERSONAL DATA 一项
如图,进入 sdkxxx --> packages --> apps --> Settings --> res -->xml 目录,编辑 privacy_settings.xml 文件夹,注释掉
<!-- <PreferenceCategory
android:title="@string/personal_data_section_title"/> -->
<!-- Factory reset -->
<!--
<PreferenceScreen
android:title="@string/master_clear_title"
android:summary="@string/master_clear_summary"
android:fragment="com.android.settings.MasterClear" />
-->
这几项就好了。
修改完了,现在得说我怎么知道该修改 这个目录下的这个文件?????
方法:
1、settings.apk 中所有出现的字符都可以在 Settings --> res --> valuesxxx --> strings.xml 的文件中找到,大师让我隐藏掉PERSONAL DATA ,我就 ctrf + f 找PERSONAL DATA ,结果没有!!!! 我X, 没办法,只能看看还能找什么其他关键字,发现PERSONAL DATA 下还有个子选项 Factory data rest ,好了我再搜,OK 找到了
<string name="master_clear_title">Factory data reset</string>
Factory data reset 只是表示的字符,anroid 真正使用该字符时是用他的 name 值作为变量名来使用的,所以这个mster_clear_title 就是我们要找的东西了!!!
2、好了回到Settings根目录,执行命令 grep -r "master_clear_title" . (不要忘记后面的. 表示当前目录的意思),查找都有哪些文件的哪些行(grep 是按行来查找文件的)引用了该变量
说过 strings.xml 只是一个资源文件,需要别人引用他,所以我们忽略所有的strings.xml ,就找到这里的 xml/privacy_settings.xml 文件了.....
3、最后一部就是回到Settings 根目录执行 mm 单独编译这个 Settings.apk ,然后安装到android设备上就好了
PS.
mm后生成的apk 位于目录: /home/bianyi/sdk5.9B-07.26.1/out/target/product/AskeyBox/system/app
2013.12.30
用NDK编译源代码,并想在源代码中打印log的方法
#include <android/log.h>
#define LOG_TAG "TEST"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)