`
yzyspy
  • 浏览: 82194 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

framework新增native方法,aidl,新类,新模块

 
阅读更多

如何向android的framework里添加新类

google对于所有的类和API,分为开放式和不开放式两种。所谓的开放式就是值javadoc所包含的,并不是java中有public和private,而是跟javadoc有关系,代码  没有关系。
在开放式的类中增加了一个变量,而又没隐藏,导致和原API的doc不一致造成的就会有错。
通过提示,有2个方法可以解决  该问题:
1、将新增加的变量或方法加上"@hide" 的注释,注意一点,加"@hide" 不是简简单单的/*@hide */就行了,标准的javadoc要这样 /**  */ 而且对于 format 变量 应该加上 {  },也就是/**{@hide}*/
2、如果想在生成的doc中增加该变量或方法的话,必须输入:
make update-api
这样的话,系统  自动  将新增加的API添加到current.xml中了。

所以如果要加方法就是按上面的方法加。


如果需要加进新的类 这时候又分2种  一种是原有的包下面加类 这个最简单 加完之后直接make update-api就好了 还有一种是加在framework/base下面 这个时候你make update-api是不会在current。xml里生成你的类的。 看了Android。mk才知道 原来需要修改android源码根目录下的build/core/pathmap.mk把你的目录加进去。然后就好了。




如果是native方法,注册
如果是service方法,AIDL










==================================================================================Android开发:Framework添加新模块
    主要是基于Android系统现在的Framework模块上再添加一个独立的模块,目前只是很简单的framework层调用native层(后期根据学习的进度,会将hal层补上,还有aidl, stub, 异步)。基本思路为:

    
    为应用添加framework接口,即SDK API
    framework调用native代码,即jni部分
    jni部分实现最终功能

    

    最终功能其实就是很简单的log打印,目的只要是重新温习一下framework开发的流程。之前都是在Android现有的机制上添加API,这次尝试添加一个独立的模块,只是个人的一个想法,不清楚Android添加一个新的独立模块的标准做法是怎样的,就当作学习吧。

    为应用添加framework接口,即SDK API

    

    在framework/base目录新建pmps目录,在pmps目录创建\java\android\pmps\PmpsManager.java 文件,输入代码:

    

    package android.pmps;

    import android.util.Log;

    

    public class PmpsManager

    {

    private static final String LOG_TAG = "PmpsManager";

    

    static {

    System.loadLibrary("pmps_jni");               

    }

    

    public PmpsManager() {

    Log.i(LOG_TAG, "PmpsManager constructor().");

    }


    public native static void sayHello();

    }

    

    PmpsManager 为应用层提供相关API,如 sayHello(),这里是直接调用了JNI的native方法。值得注意的是PmpsManager加载了中的System.loadLibrary("pmps_jni")加载了文章中第3步将会生成的libpmps_jni.so文件。

    

    还有一个需要注意的细节,我们可以先看一下framework/base目录下的Android.mk文件,其中有一段:

    # FRAMEWORKS_BASE_SUBDIRS comes from build/core/pathmap.mk

    LOCAL_SRC_FILES := $(call find-other-java-files,$(FRAMEWORKS_BASE_SUBDIRS))

    我们再看看build/core/pathmap.mk,其中有一段

    

    FRAMEWORKS_BASE_SUBDIRS := \

    $(addsuffix /java, \

        core \

        graphics \

        location \

        media \

        opengl \

        sax \

        telephony \

        wifi \

        vpn \

        keystore \

        voip \

     )

    

    也就是说我们要在build/core/pathmap.mk文件中添加pmps目录,添加后为:

    FRAMEWORKS_BASE_SUBDIRS := \

    $(addsuffix /java, \

        core \

        graphics \

        location \

        media \

        opengl \

        sax \

        telephony \

        wifi \

        vpn \

        keystore \

        voip \

        pmps \

     )

    

    然后我们就可以通过 mmm 命令编译这个新添加的模块了。

    mmm framework/base 编译,生成文件为out/target/product/generic/system/framework/framework.jar

    代码编译通过后,就可以做接下来的事情了。


    2.framework调用native代码,即jni部分

    上一步中的 publicnative static void sayHello() 就可以由应用层调用了,当然我们可以在framework里面再封装一下,以实现更加复杂的功能,例如:

    

    //api

    public int sayHelloFirst()

    {

    //省略的代码...

    return sayHello();

    }

    

    //declaration

    public native static void sayHello();

    

    3.jni部分实现功能


    这一步通过编写native代码实现framework中的调用的功能,可以实现具体的功能或者调用hal层的相关驱动,完成硬件操作功能。

    当前只是简单地打印一下信息。

    

    值得注意的要实现JNI_OnLoad函数,如果有需要的话,也可以重写JNI_OnUnLoad函数。

    

    /*//device/libs/android_runtime/android_media_MediaPlayer.cpp

    **

    ** Copyright 2007,The Android Open Source Project

    **

    ** Licensed under theApache License, Version 2.0 (the "License");

    ** you may not usethis file except in compliance with the License.

    ** You may obtain acopy of the License at

    **

    **     http://www.apache.org/licenses/LICENSE-2.0

    **

    ** Unless required byapplicable law or agreed to in writing, software

    ** distributed underthe License is distributed on an "AS IS" BASIS,

    ** WITHOUT WARRANTIESOR CONDITIONS OF ANY KIND, either express or implied.

    ** See the Licensefor the specific language governing permissions and

    ** limitations underthe License.

    */

    

    #define LOG_NDEBUG 0

    #define LOG_TAG"PmpsManager-JNI"

    #include"utils/Log.h"

    

    #include<stdio.h>

    #include<assert.h>

    #include<limits.h>

    #include<unistd.h>

    #include<fcntl.h>

    #include"jni.h"

    #include"JNIHelp.h"

    #include"android_runtime/AndroidRuntime.h"

    //----------------------------------------------------------------------------

    

    using namespaceandroid;

    

    static voidandroid_pmps_PmpsManager_sayHello(JNIEnv *env, jobject thiz)

    {

    LOGV("sayHello()");

    }

    

    static constJNINativeMethod method_table[] = {

    {"sayHello","()V", (void*)android_pmps_PmpsManager_sayHello},

    };       

    

    // This function onlyregisters the native methods

    intregister_android_pmps_PmpsManager(JNIEnv *env) {

    inti;

    

    LOGI("JNI_OnLoad:register_android_pmps_PmpsPlayer");

    

    returnAndroidRuntime::registerNativeMethods(env,

    "android/pmps/PmpsManager",method_table, NELEM(method_table));

    }

    

    

    jintJNI_OnLoad(JavaVM* vm, void* reserved)

    {

        JNIEnv* env = NULL;

        jint result = -1;

    

        if (vm->GetEnv((void**) &env,JNI_VERSION_1_4) != JNI_OK) {

            LOGE("ERROR: GetEnvfailed\n");

            goto bail;

        }

        assert(env != NULL);

    

        if (register_android_pmps_PmpsManager(env)< 0) {

            LOGE("ERROR: PmpsManager nativeregistration failed\n");

            goto bail;

        }

    

        /* success -- return valid version number*/

        result = JNI_VERSION_1_4;

    

    bail:

        return result;

    }
分享到:
评论

相关推荐

    小莫的framework实战2-AIDL通讯实战

    AIDL远程通讯客户端、服务端 MESSENGER通讯服务端及本地通讯

    android Aidl 客户端和服务端Demo

    例如,我们可以有一个`IAidlInterface.aidl`,里面声明一个方法如`int add(int a, int b)`。编译后,Android Studio会自动生成对应的Java接口和Binder实现。 然后,在服务端实现该接口,注册到Binder,并在Service...

    AIDL客户端和服务端两个模块.zip

    在"AIDL客户端和服务端两个模块.zip"中,我们看到的是一个完整的案例,涵盖了服务端和客户端的实现,这将帮助开发者深入理解如何在实际项目中应用AIDL。 首先,让我们详细探讨服务端的实现。在Android服务端,我们...

    framewor kaidl

    AIDL(Android Interface Definition Language)是Android用于生成进程间通信(IPC)代码的工具,允许不同进程间的对象相互调用方法。而Kaidl是AIDL的扩展,专为Android内核服务设计,使得内核级别的服务也能通过...

    安卓端Socket连接的方法aidl+server

    "安卓端Socket连接的方法aidl+server"这个主题主要涉及到如何在Android客户端(client)和服务器(server)之间建立Socket连接,以及如何利用Android Interface Definition Language (AIDL)来辅助实现这一过程。...

    AIDL和JNI使用的小例子

    AIDL会为这个接口生成对应的Java类,客户端和服务端都会使用这个类来实现或调用接口方法。 **Java Native Interface (JNI)** JNI是Java平台的标准接口,它允许Java代码和其他语言写的代码进行交互。在Android开发中...

    aidl 电话文件 ITelephony.aidl NeighboringCellInfo.aidl

    `ITelephony.aidl`包含了一系列的方法声明,例如: ```java interface ITelephony { void endCall(); boolean answerRingingCall(); boolean silenceRinger(); // 其他方法... } ``` 这些方法允许第三方应用在...

    AIDLDemo,Android aidl 使用demo

    在AIDLDemo项目中,可以深入研究服务器端的`IMyService.aidl`文件、服务实现类(如`MyServiceImpl.java`)和客户端的调用代码(如`MainActivity.java`),以理解AIDL的工作原理和使用方法。 通过AIDLDemo项目的学习...

    AIDL双向绑定kotlin版本

    `app`目录下应该是项目的主要源代码,包括服务端和客户端的Kotlin类,以及AIDL接口定义。`.gradle`目录则存储了Gradle的缓存和配置信息。 通过以上步骤,我们可以构建一个基于AIDL的双向绑定服务,利用Kotlin的简洁...

    AndroidAIDL

    - 在服务类中,声明实现AIDL接口的成员变量,并重写`onBind()`方法,返回Stub的实例。 客户端调用: - 在客户端,通过`bindService()`方法绑定服务,获取到AIDL接口的实现对象。 - 调用接口中的方法进行通信。 **4...

    Android多进程通讯AIDL传递Parcelable对象

    AIDL(Android Interface Definition Language)是Android提供的一种接口定义语言,用于支持跨进程调用方法,从而实现多进程间的通信。 AIDL的基本原理是将接口定义为一个.aidl文件,系统会自动生成对应的Java代码...

    invoice-scanner-react-native:AIDL 2020团队代码组针对问题1的解决方案。将ML Kit用于OCR和OpenCV进行图像处理

    CodeSquad PS1 技术针对AIDL 2020问题陈述1的解决方案。问题给定票据/发票的图像,任务是执行以下3种操作: 边缘检测,裁切,拉平,裁切图像的增强和压缩。 从处理后的图像中提取文本。 图像到文本转换的置信度得分...

    aidl自定义类型

    在Android系统中,AIDL(Android Interface Definition Language)是一种用于进程间通信(IPC,Inter-Process Communication)的机制,允许不同进程之间的应用组件相互调用方法。本篇将深入探讨如何在AIDL中自定义...

    ITelephony.aidl和NeighboringCellInfo.aidl

    AIDL文件定义了服务端和客户端之间的数据传输协议,编译后会自动生成相应的Java接口和Binder类,便于在客户端和服务端之间进行数据交换。 总结一下,`ITelephony.aidl`和`NeighboringCellInfo.aidl`是Android系统中...

    android aidl 本地和aidl通信,远端和aidl

    AIDL的基本语法类似于Java,但更注重于定义接口和数据类型,而不是完整的类实现。 **二、本地AIDL通信** 1. **定义接口**:首先,在服务端创建一个AIDL文件,例如`IService.aidl`,在其中声明接口及其方法。例如:...

    AIDLDemo.zip

    当你在服务端定义了一个AIDL接口,Android会自动生成对应的Java代理类,客户端可以使用这个代理类来调用服务端的方法,就像调用本地方法一样。这使得跨进程通信变得简单而直观。 在"AIDLDemo.zip"中,`remoteclient...

    AIDL简单实例下载

    这个实例包含客户端和服务端两个项目,每个项目可能还包含了多个模块,便于理解和实践AIDL的用法。 ### 一、AIDL的基本概念 1. **进程间通信(IPC,Inter-Process Communication)**:在Android中,不同的应用程序...

    AIDL如何使用

    通过AIDL,开发者可以声明服务提供的方法和参数类型,系统会自动生成对应的 Binder 类,处理进程间的通信细节。简单来说,AIDL就是一种让Android应用能够在不同进程中调用服务的方法。 ### AIDL原理 AIDL的工作...

    aidl.rar_AIDL_AIDL.rar_android AIDL service_android service_andr

    AIDL帮助开发者定义接口,使得客户端和服务端能透明地共享数据和调用方法。以下是关于AIDL的详细知识点: 1. **接口定义**: AIDL文件是`.aidl`格式,它以类似Java的方式定义接口。例如: ``` package ...

    Android aidl实现传递对象

    在Android项目中,创建一个新的aidl文件,例如`IAidlInterface.aidl`,并定义一个接口: ```aidl package com.example.aidldemo; parcelable MyObject; // 声明自定义对象为Parcelable interface IAidlInterface ...

Global site tag (gtag.js) - Google Analytics