方法一:
1.在應用中
com.xxx.spi.spllistener.java/com.xxx.spi.spimanager.java兩個類
spimanager spimanager = (spimanager) getsystemservice("spiservice");
spilistener = new myspilistener();
spimanager.requestspiupdates(spilistener);
2.
需在android.app.contextimpl.java中添加
private static spimanager sspimanager;
else if (spi_service.equals(name)) {
return getspimanager();
}
private spimanager getspimanager() {
synchronized (ssync) {
if (sspimanager == null) {
ibinder b = servicemanager.getservice(spi_service);
ispimanager service = ispimanager.stub.asinterface(b);
sspimanager = new spimanager(service);
}
return sspimanager;
}
在android.content.context.java中添加常量
public static final string spi_service = "spiservice";
3.com.xxx.spi.spimanager.java
中有ispilisterner.aidl的實作類listenertransport
private class listenertransport extends ispilistener.stub
listenertransport中有應用中注冊進來的回調監聽器spilistener
listenertransport傳給frameworks/base/services/java/com/android/server/spimanagerrservice.java服
務器類,也就是aidl的回調注冊,一定是實作ispilistener.stub的listenertransport類
spimanagerservice.java是通過jni調c++檔案,其中需要把自己作為c++的回調對象,
在cpp檔案中取得spimanagerservice類對象
static { class_init_native(); }初始化回調的方法,這樣在cpp檔案中就随時可以調class_init_native本地
方法中初始化過的函數。
4.frameworks/base/android.mk檔案中編譯ispilistener.aidl,ispimanager.aidl兩個檔案成相應的java檔案
frameworks/base/services/jni/android.mk檔案中編譯同目錄下的
com_android_server_spimanagerservice.cpp檔案,注意cpp檔案的命名與其對應的spimanagerservice.java
檔案的包路徑之間的關系。
同目錄下的onload.cpp檔案中添加
int register_android_server_spimanagerservice(jnienv* env);
register_android_server_spimanagerservice(env);
5.
frameworks/base/services/java/com/android/server/systemserver.java中添加服務,并調服務的
systemready方法
try {
slog.i(tag, "---spi manager---");
spiservice = new spimanagerservice(context);
servicemanager.addservice("spiservice", spiservice);
} catch (throwable e) {
slog.e(tag, "---failure starting spiservice manager---", e);
if (spiservicef != null) spiservicef.systemready();
6.
frameworks/base/core/jni/androidruntime.cpp中添加
extern int register_android_server_spimanagerservice(jnienv* env);
不确定是不是必須的
方法二:
在systemserver.java中添加自己有make檔案建立的包
system.loadlibrary("android_servers");
system.loadlibrary("serialserver");