简介
上一章实现了JNI C++,这篇主要实现Java去调用JNI并为应用层提供AIDL服务!
一、定义AIDL接口
在frameworks/base/core/java/android/os
目录下创建IHelloService.aidl
文件:
package android.os;
interface IHelloService {
void setVal(int val);
int getVal();
}
这里提供了设值和取值两个对外函数;
二、修改编辑脚本Android.mk
到frameworks/base
目录,打开Android.mk文件,修改LOCAL_SRC_FILES
变量的值,增加IHelloService.aidl源文件:
LOCAL_SRC_FILES += \
.....
core/java/android/os/IHelloService.aidl \
.....
三、创建服务HelloService
frameworks/base/services/java/com/android/server
目录,创建HelloService.java
服务类文件;
package com.android.server;
import android.content.Context;
import android.os.IHelloService;
import android.util.Log;
public class HelloService extends IHelloService.Stub {
private static final String TAG = "HelloService";
HelloService() {
Log.d(TAG, "HelloService init_native");
init_native();
}
public void setVal(int val) {
Log.d(TAG, "HelloService setVal val:" + val);
setVal_native(val);
}
public int getVal() {
Log.d(TAG, "HelloService getVal val");
return getVal_native();
}
private static native boolean init_native();
private static native void setVal_native(int val);
private static native int getVal_native();
};
HelloService主要是通过调用JNI方法init_native、setVal_native、getVal_native
为提供硬件服务;
四、启动服务
服务在SystemServer服务中启动,运行在安卓第二大进程system_server
中!
修改frameworks/base/services/java/com/android/server/SystemServer.java
文件,在startOtherServices()
中增加加载HelloService的代码
import com.android.server.HelloService;
......
private void startOtherServices() {
......
// 启动 HelloService 并添加到ServiceManager中
// add HelloService start
try {
traceBeginAndSlog("HelloService");
Slog.i(TAG, "add HelloService");
ServiceManager.addService("hello", new HelloService());
traceEnd();
} catch (RuntimeException e) {
Slog.e("HelloService", "******************************************");
Slog.e("HelloService", "************ Failure starting HelloService", e);
}
// add Hello Service end
......
}
五、服务添加Selinux权限:
- 5.1修改
system/sepolicy/private/service_contexts
bluetooth u:object_r:bluetooth_service:s0
+hello u:object_r:hello_service:s0
- 5.2修改
system/sepolicy/public/service.te
+type hello_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;
type search_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;
这一步是为了上次App能够访问到AIDL;
六、编译
直接编译system.img,或单模块编译之后adb push进行测试;
root@ubuntu:make snod -j8
网友评论