文档介绍:(Thread)模式
在之前的课程里,都只介绍Java层的线程模式。其实担任软硬整合的嵌入式软件开发者,在开发Shared Library (*.so)及其卡榫类别时,更需要充分理解Android的线程模式,于此就来说说其原因吧!
在Android平台上开发软硬整合的共享链接库(Shared Library)时,由于是「共享」的程序组件,所以可能有许多Activity或Service等组件来呼叫此共享链接库(例如某一个*.so可执行档)。由于这些Activity或Service等组件可能是别人开发的,也在不同的进程里执行,也有可能是以子线程来呼叫。
这个时候,写共享链接库的开发者如何撰写其*.so链接库呢?即使*.so链接库写好了,也安装好了,又如何撰写在Java层与之相对应的「卡榫类别」(Hook Class)呢?
兹以Android平台所提供的MediaPlayer组件为例,。如下图:
 
开发此类别时,,一方面又要接受底层*.so所回传的信息,此种讯息到底是那一个线程所执行而传递回来的呢?如此才能将*.so组件纳入到Android平台里,让众多的Activity或Service等Java组件来共享之。
如果对Android的线程模式有充分的认识,就很容易弄清楚程序的写法。否则,甚至连别人所写的程序代码可能都不易看懂。例如,:
public class MediaPlayer
{
static {
("media_jni");
}
// 省略
public MediaPlayer() {
Looper looper;
if ((looper = ()) != null) {
mEventHandler = new EventHandler(this, looper);
} else if ((looper = ()) != null) {
mEventHandler = new EventHandler(this, looper);
} else {
mEventHandler = null;
}
/* Native setup requires a weak reference to our object.
* It's easier to create it here than in C++.
*/
native_setup(new WeakReference<MediaPlayer>(this));
}
这个建构式里的指令就是在处理线程的讯息交换,它是为了要让*.so能回传一些讯息给Java 层的应用类别。
此时,如果你能对Android有如下的认识,就很容易