android的apk想要获取底层的数据或者接口,要实现底层的相关服务,现对此作出记录
1,编写hal层
hal层代码主要是对驱动提供的接口进行操作,其中有open ,read,write,mmap,ioctl和sys下的一些接口的操作;
hal层代码严格按照安卓的那套写法编写,hal层代码的作用是对底层驱动的数据进行解析,把有效的东西给JNI,hal层代码编译成动态库,在加载的时候统一加载
2,编写JNI层
JNI层是链接hal层和java层的操作,具体就是提供接口给java,同时完善接口调用HAL层的东西;
JNI是怎样得到和调用hal层的函数呢?
frameworks/base/services/jni/com_android_server_McuService.cpp
static jint mcu_init(JNIEnv* env, jclass clazz) {
mcu_module_t* module;
mcu_device_t* device;
SLOGI("Initializing HAL stub mcu......lgq");
if(!gs_jvm){
env->GetJavaVM(&gs_jvm);
}
if(!mCallbacksObj){
mCallbacksObj = env->NewGlobalRef(clazz);
}
if(!method_report_mcu_data){
method_report_mcu_data = env->GetStaticMethodID(clazz, "mcuCallBack", "([B)V");
}
if(hw_get_module(FREG_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module) == 0) {
SLOGI("Device mcu found.");
if(mcu_device_open(&(module->common), &device) == 0) {
SLOGI("Device mcu is open.");
return (jint)device;
}
SLOGE("Failed to open device mcu.");
return 0;
}
SLOGE("Failed to get HAL stub mcu.");
return 0;
}
JNI层是怎样注册本地函数呢?
frameworks/base/services/jni/com_android_server_McuService.cpp
frameworks/base/services/jni/onload.cpp
static const JNINativeMethod method_table[] = {
{"init_native", "()I", (void*)mcu_init},
{"register_callback_native", "(II)I", (void*)mcu_register_callback},
{"setVal_native", "(II)V", (void*)mcu_setVal},
{"getVal_native", "(I)I", (void*)mcu_getVal},
{"txData_native", "(I[B)I", (void*)mcu_txData},
};
int register_android_server_McuService(JNIEnv *env) {
return jniRegisterNativeMethods(env, "com/android/server/McuService", method_table, NELEM(method_table));
}
其中
register_android_server_McuService(JNIEnv *env)
在frameworks/base/services/jni/onload.cpp 中注册
3,java服务的编写
java是怎么写一个服务让不同apk调用的呢?
先写一个 xxx.aidl文件
frameworks/base/core/java/android/os/IMcuService.aidl
package android.os;
interface IMcuService {
void setVal(int val);
int getVal();
}
在编写xxx.aidl之后会创建一些stub之类的类,比如:
frameworks/base/services/java/com/android/server/McuService.java
在此文件下会完善 set_Val 和get_val函数,但是这两个函数都是调用JNI创建的本地函数,那么怎么使用呢?
public class McuService extends IMcuService.Stub{
public void setVal(int val) {
if(mPtr == 0) {
Slog.e(TAG, "Mcu service is not initialized.");
return;
}
setVal_native(mPtr, val);
}
public int getVal() {
if(mPtr == 0) {
Slog.e(TAG, "Mcu service is not initialized.");
return 0;
}
return getVal_native(mPtr);
}
private static native int init_native();
private static native void setVal_native(int ptr, int val);
private static native int getVal_native(int ptr); //这几个函数就是为上面的函数服务的;
}