Android 底层框架笔记

android底层的实现

     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);   //这几个函数就是为上面的函数服务的;
}















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值