- 博客(26)
- 资源 (5)
- 收藏
- 关注
原创 C语言宏定义技巧——多次包含头文件内容不同
1、 头文件定义如下:/* declears in “funcs.h” */FUNC_1(ID_FUN1_001)FUNC_1(ID_FUN1_002)FUNC_2(ID_FUN2_001)FUNC_2(ID_FUN2_002) 2、 多次包含头文件#define FUNC_1(opt) opt,#define FUNC_2(opt)enum aaa {
2014-09-29 21:21:16 1998
原创 C语言宏定义技巧——头文件多次包含
1、 头文件定义如下:/* declears in “funcs.h” */FUNC_1(ID_FUN1_001)FUNC_1(ID_FUN1_002)FUNC_2(ID_FUN2_001)FUNC_2(ID_FUN2_002) 2、 多次包含头文件#define FUNC_1(opt) opt,#define FUNC_2(opt)enum aaa {
2014-09-29 21:16:34 551
原创 MediaPlayer本地播放流程解析(三)
这一篇文章接着之前的prepare,讲play的流程前面的流程省略,直接从AwesomePlayer的Play()开始讲。status_t AwesomePlayer::play() { …… return play_l();}status_t AwesomePlayer::play_l() { …… if (mAudioSource != NUL
2014-09-22 23:49:51 4728 1
原创 TimedEventQueue分析
AwesomePlayer里面定义了一个TimedEventQueue,通过向它发事件消息,来驱动player的运转。定义在AwesomePlayer.h里面,如下:TimedEventQueue mQueue;TimedEventQueue中维护了一个队列,外面通过调用其提供的方法postEvent, postEventWithDelay等等来向队列添加事件,在执行完mQueue.s
2014-08-21 15:52:54 2502
原创 MediaPlayer本地播放流程解析(二)
上一篇MediaPlayer本地播放流程解析(一)讲了MediaPlayer的setDataSource流程,本篇将接着讲MediaPlayer的prepare流程。Prepare前面的流程一直到AwesomePlayer,和setDataSource都基本上一样,这里直接略掉。下面将从AwesomePlayer开始。status_t AwesomePlayer::prepare() {
2014-08-20 19:54:43 3265
原创 MediaPlayer本地播放流程解析(一)
应用场景:MediaPlayer mediaPlayer = new MediaPlayer();mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mediaPlayer.release(); m
2014-08-18 22:35:38 22431 4
原创 handler looper和messageQueue
一、使用方法。Looper用来处理消息循环,在创建过程中会初始化MessageQueue。Handler在其它线程发消息给当前线程MessageQueue用来存放消息 Looper对象在哪个线程创建,Handler的handleMessage方法就在哪个线程执行 在创建activity时,android系统本身会为activity创建Looper。final Han
2014-08-13 20:03:29 1073
转载 Android--hw_get_module解析
我们知道,google为了保护硬件厂商的信息,在Android中添加了一层,也就是大名鼎鼎的HAL层。在看HAL的编写方法的过程中,会发现整个模块貌似没有一个入口。一般说来模块都要有个入口,比如应用程序有main函数,可以为加载器进行加载执行,dll文件有dllmain,而对于我们自己写的动态链接库,我们可以对库中导出的任何符号进行调用。 问题来了,Android
2014-07-17 16:18:13 992
原创 android binder 机制三(匿名Service)
什么是匿名Service?凡是没有到ServiceManager上注册的Service,都是匿名Service。还是拿上一篇的例子来举例,看代码:status_t MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length){ status_t err = UNKNOWN_ERROR; const s
2014-07-15 23:29:02 3287 2
原创 android binder 机制二(client和普通server)
本文介绍android binder通信中,普通server进程如何工作,已经client和普通server之间如何通信
2014-07-14 17:06:19 4376
原创 android binder 机制 (ServiceManager)
Binder机制作为一种IPC通信机制,在android系统中扮演了非常重要的角色,因此我也花了一些时间来研究它,按照我的理解,下面我将从4个方面来讲一下Binder,如有不对的地方,还希望大家多多指教。下面的例子都将以MediaServer来讲。一、ServiceManagerServiceManager在Binder系统中相当与DNS,Server会先在这里注册,然后Client会在这
2014-07-13 13:20:25 5868 1
原创 JNI学习三(Local references & Global references 以及JNI内存泄露)
Local Reference 和 Global ReferenceJNI支持三种类型的opaquereference:local references, global references和weak globalreferences Local reference 只在本线程的nativemethod中有效,native method返回到Java层时将自动释放。一般是JNI自动创建
2014-07-09 15:26:52 10484 2
原创 JNI学习二(数据类型)
JNI之数据类型JNI层基本数据类型: jboolean, jbyte, jchar, jshort, jint,jlong, jfloat, jdouble JNIEXPORTjstring JNICALLJava_Prompt_getLine(JNIEnv*env, jobject this, jstring prompt);其中:JNIEnv 为J
2014-07-09 08:42:56 746
原创 JNI学习一(入门篇)
JNI之特性JNI特性:1、 native code 底层操作,更加高效2、 打破了java的平台无关性,可移植性需要自己解决3、 Java面向对象语言的封装性被破坏了,Java类中任何方法和属性对JNI都是可见的,包括private4、 从java环境到native code的上下文切换耗时、低效5、 JNI编程,操作不当,可能引起内存泄露 JNI之qu
2014-07-08 16:27:27 692
原创 android keydown touch事件传递
1、 onKeyDown事件 Android系统最先触发按键上绑定的事件监听器,然后才触发该组件提供的事件回调方法,最后传播到该组件所在的Activity public class MyButton extends Button { publicMyButton(Context context, AttributeSet set) {
2014-07-03 18:11:45 3451
转载 android onTouch()与onTouchEvent()的区别
1.onTouch方法:onTouch方法是View的 OnTouchListener借口中定义的方法。当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTouch方法。(当把手放到View上后,onTouch方法被一遍一遍地被调用)2.onTouchEvent方法:onTouchEvent方法是override 的Activity
2014-06-23 14:46:00 593
原创 undefined reference to 'dlopen'
LOCAL_SHARED_LIBRARIES += \libdlLOCAL_LDLIBS += \-lpthread \-ldl \
2014-05-23 10:09:38 2446 2
原创 宏函数及其用法
1、在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组,如:#define P(A) printf(“%s : %d”, #A,(A))Int a=1,b=2;P(a+b);则会输出:a+b : 32、 “##”是一种分割连接方式,它的作用是先分割,然后进行强制连接。例如:#define A1(name, type) type name
2014-05-23 09:45:42 1541
转载 Android - 文件读写操作 总结
在android中的文件放在不同位置,它们的读取方式也有一些不同。本文对android中对资源文件的读取、数据区文件的读取、SD卡文件的读取及RandomAccessFile的方式和方法进行了整理。供参考。一、资源文件的读取: 1) 从resource的raw中读取文件数据:[java] view plaincopy
2014-05-05 09:45:43 633
原创 一个关于结构体的问题
typedef struct tagNODE{ char *a; int b;} NODE; NODE iNode; 定义一个这样的结构体变量后,偶就很郁闷了,因为不知道iNode.a是否申请过内存,使用的时候总是提心吊胆的,我按照如下的方法来使用这个变量: switch(message){ case MSG_CREAT
2009-04-20 21:40:00 135
原创 我项目中触摸屏MSG_UP消息不可靠
最近发现我当前的项目中触摸屏MSG_UP消息有时候收不到,导致我的应用模块运行不对了,于是想了一个办法补救一下。 static int waitCnt = -1; case MSG_CREATE:{ fnGUI_SetTimer(hWnd, TIMERID, TIME_MS(100)); waitCnt = -1;}break;
2009-04-20 21:25:00 234
原创 不用if-else实现英文字符大小写转换
char str[100] = "hello";int index; for(index = 0; str[index]; index++){ str[index] &= 0xDF; // 转化为大写字符 str[index] |= 0x20; // 转化为小写字符}
2008-11-01 09:45:00 327
原创 C++ 一些数据类型的转换
1、CString to char* : CString cStr = "Hello,world!"; char* zStr = (char*)(LPCTSTR)cStr; 2、CString to LPCSTR 将CString转换成LPCSTR,需要获得CString的长度,例如: CString cStr =
2008-04-04 09:39:00 494
原创 strcpy(), memcpy(), Write(), Read().
strcpy(char *dest, char *src) 从src 复制到dest, 复制的字符串以/0结束memcpy(char *dest, char *src, int nCount) 从src复制nCount个bytes的内容到destCFile类的Write(const void* lpBuf, UINT nCount), Read(void* lpBuf, UINT n
2008-04-03 16:02:00 647
3gpp 36331
2017-12-20
android jni详解
2014-07-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人