Android12之源码手动生成aidl对应java/cpp/ndk/rust服务(一百五十三)

news2024/11/16 10:33:46

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:在android源码中手动生成aidl对应的java/cpp/ndk/rust语言的binder服务。

2.生成aidl对应的java服务

<1>.编写ITest.aidl

# mkdir -p aidl/com/test
# cd aidl/com/test

# emacs ITest.aidl

package aidl.com.test;
interface ITest {
	  void get(int arg);
}

注意:路径名(aidl/com/test)和包名(aidl.com.test)要一样,唯一不同是"/“和”."区分,否则编译报错。

<2>.生成ITest.aidl对应ITest.java服务文件

不指定参数,默认生成java服务文件
# aidl aidl/com/test/ITest.aidl

或者使用如下命令
# 这3条命令和上边一样,只是指定了参数
# aidl -o ./java --lang=java aidl/com/test/ITest.aidl
# tree java
java
└── aidl
    └── com
        └── test
            └── ITest.java
Or
# aidl -o ./java aidl/com/test/ITest.aidl
Or
# aidl -I ./aidl/ -o ./java aidl/com/test/ITest.aidl

注意:
-o:表示输出路径,为当前目录的java文件,它会创建一个java目录,然后在java目录中存放生成的ITest.java文件。
-I:表示依赖其他的.aidl文件。
--lang:表示支持生成的语言有哪些,如:java、cpp、ndk、rust,目前到Android12,只支持这四种语言。

# ls -al aidl/com/test/ITest.java

ITest.java

/*
 * This file is auto-generated.  DO NOT MODIFY.
 */
package aidl.com.test;
public interface ITest extends android.os.IInterface
{
  /** Default implementation for ITest. */
  public static class Default implements aidl.com.test.ITest
  {
    @Override public void get(int arg) throws android.os.RemoteException
    {
    }
    @Override
    public android.os.IBinder asBinder() {
      return null;
    }
  }
  /** Local-side IPC implementation stub class. */
  public static abstract class Stub extends android.os.Binder implements aidl.com.test.ITest
  {
    /** Construct the stub at attach it to the interface. */
    public Stub()
    {
      this.attachInterface(this, DESCRIPTOR);
    }
    /**
     * Cast an IBinder object into an aidl.com.test.ITest interface,
     * generating a proxy if needed.
     */
    public static aidl.com.test.ITest asInterface(android.os.IBinder obj)
    {
      if ((obj==null)) {
        return null;
      }
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      if (((iin!=null)&&(iin instanceof aidl.com.test.ITest))) {
        return ((aidl.com.test.ITest)iin);
      }
      return new aidl.com.test.ITest.Stub.Proxy(obj);
    }
    @Override public android.os.IBinder asBinder()
    {
      return this;
    }
    @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
    {
      java.lang.String descriptor = DESCRIPTOR;
      switch (code)
      {
        case INTERFACE_TRANSACTION:
        {
          reply.writeString(descriptor);
          return true;
        }
      }
      switch (code)
      {
        case TRANSACTION_get:
        {
          data.enforceInterface(descriptor);
          int _arg0;
          _arg0 = data.readInt();
          this.get(_arg0);
          reply.writeNoException();
          return true;
        }
        default:
        {
          return super.onTransact(code, data, reply, flags);
        }
      }
    }
    private static class Proxy implements aidl.com.test.ITest
    {
      private android.os.IBinder mRemote;
      Proxy(android.os.IBinder remote)
      {
        mRemote = remote;
      }
      @Override public android.os.IBinder asBinder()
      {
        return mRemote;
      }
      public java.lang.String getInterfaceDescriptor()
      {
        return DESCRIPTOR;
      }
      @Override public void get(int arg) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(arg);
          boolean _status = mRemote.transact(Stub.TRANSACTION_get, _data, _reply, 0);
          if (!_status) {
            if (getDefaultImpl() != null) {
              getDefaultImpl().get(arg);
              return;
            }
          }
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      public static aidl.com.test.ITest sDefaultImpl;
    }
    static final int TRANSACTION_get = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    public static boolean setDefaultImpl(aidl.com.test.ITest impl) {
      // Only one user of this interface can use this function
      // at a time. This is a heuristic to detect if two different
      // users in the same process use this function.
      if (Stub.Proxy.sDefaultImpl != null) {
        throw new IllegalStateException("setDefaultImpl() called twice");
      }
      if (impl != null) {
        Stub.Proxy.sDefaultImpl = impl;
        return true;
      }
      return false;
    }
    public static aidl.com.test.ITest getDefaultImpl() {
      return Stub.Proxy.sDefaultImpl;
    }
  }
  public static final java.lang.String DESCRIPTOR = "aidl.com.test.ITest";
  public void get(int arg) throws android.os.RemoteException;
}

3.生成aidl对应的cpp服务

还是以ITest.aidl为例子,生成对应的cpp的binder服务

# aidl -h ./aidl_cpp/ -o ./aidl_cpp --lang=cpp aidl/com/test/ITest.aidl
Or
# aidl -I ./aidl_dep -h ./aidl_cpp/ -o ./aidl_cpp --lang=cpp aidl/com/test/ITest.aidl
注意:
--lang=cpp:表示生成Android源码下编译的C++接口文件。
-o:表示.cpp文件输出路径
-h:表示.h文件输出的路径
-I:表示依赖其他*.aidl文件


# tree aidl_cpp
aidl_cpp
└── aidl
    └── com
        └── test
            ├── BnTest.h
            ├── BpTest.h
            ├── ITest.cpp
            └── ITest.h

注意:
Interface头文件:ITest.h
Bp头文件:BpTest.h
Bn头文件:BnTest.h
源码文件:ITest.cpp

4.生成aidl对应的ndk服务

还是以ITest.aidl为例子,生成对应的ndk的binder服务

# aidl -h ./aidl_ndk -o ./aidl_ndk --lang=ndk aidl/com/test/ITest.aidl

# tree aidl_ndk
aidl_ndk
└── aidl
    ├── aidl
    │   └── com
    │       └── test
    │           ├── BnTest.h
    │           ├── BpTest.h
    │           └── ITest.h
    └── com
        └── test
            └── ITest.cpp

5.生成aidl对应的rust服务(因为Android已经支持Rust语言开发)

Rust是一个跨平台开发语言,支持Android,iOS,桌面,Web和后端的开发。
还是以ITest.aidl为例子,生成对应的Rust的binder服务

# aidl -o ./aidl_rust --lang=rust aidl/com/test/ITest.aidl
# tree aidl_rust
aidl_rust/
└── aidl
    └── com
        └── test
            └── ITest.rs

6.在Android.bp中自动生成aidl对应的java/cpp/ndk/rust服务

Android.bp

aidl_interface {
    name: "Test",
    srcs: [ "aidl/com/test/*.aidl", ],
    unstable: true,
    backend: {
        java: {
            enabled: false,
            platform_apis: true,
        },
        cpp: {
            enabled: false,
        },
        ndk: {
            enabled: true,
            vndk: {
                enabled: false,
            },
        },
    //Android12才支持编译aidl对应Rust服务
        rust: {
             enabled: true,
        },
    },
}

注意:编译aidl对应哪个语言支持,将enabled设置为:true,如果不想生成则设置为:false。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593210.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【自动化项目实战】博客系统

目录 1.博客自动化测试用例 2.准备工作 3.将手工测试用例转化为自动化测试用例 3.1 初始化动作 3.2 登录 3.3 博客列表博客数量 3.4 查看全文 3.5 写博客&发表博客 3.6 删除 3.7 注销 4.总代码 &#x1f308;这节文章我们讲解一个实战项目——博客系统。首先我…

在前公司年薪38W,经人内推腾讯居然被拒了···

末流院校&#xff0c;带17人研发团队&#xff0c;到手38w股票20w&#xff0c;过硬的技术让我觉得可以出去“闯闯”;内推到某大厂&#xff0c;电话里聊得挺好&#xff0c;结果第二天说不给安排面试了…… 被拒绝很正常&#xff0c;想必应该是能力不足&#xff0c;不能满足公司的…

太难了,00后求求你们别这么卷了....

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&#x…

网络传输(传输介质、通信方式、交换方式)

目录 一、传输介质1.双绞线2.网线安装3.光纤4.无线信道 二、通信方式、交换方式1.通信方式2.同步方式3.交换方式 一、传输介质 1.双绞线 双绞线&#xff1a;将多根铜线按规则缠绕在一起&#xff0c;能够减少干扰&#xff1b;分为无屏蔽双绞线UTP和屏蔽双绞线STP&#xff0c;都…

PCIE学习

目录 一、PCIE结构1、层次结构2、数据包TLPDLLP PCIE寄存器配置1、基址寄存器的作用2、基址寄存器的位置 三、PCIE读取数据 一、PCIE结构 1、层次结构 绝大多数的总线或者接口&#xff0c;都是采用分层实现的。PCIe也不例外&#xff0c;它的层次结构如下&#xff1a; PCIe定…

MAYA绳子和铁链动画(3个例子)

一两条边中间加定位器 // Copyright (C) 2000-2001 Michael Bazhutkin - Copyright (C) 2000 studio Klassika // www.geocites.com/bazhutkin // bazhutkinmail.ru // // Rivet (button) 1.0 // Script File // MODIFY THIS AT YOUR OWN RISK // // Creation Date: Apri…

【Unittest】自动化测试框架核心要素

1、什么是Unittest框架&#xff1f; python自带一种单元测试框架 2、为什么使用UnitTest框架&#xff1f; >批量执行用例 >提供丰富的断言知识 >可以生成报告 3、核心要素&#xff1a; 1). TestCase&#xff08;测试用例&#xff09; 2). TestSuite(测试套件)…

系统分析师:七、软件工程(含系统规划)

一、软件生命周期 软件生命周期分为5个&#xff1a;获取过程、供应过程、开发过程、运行过程、维护过程&#xff0c;具体如下&#xff1a; 二、软件开发方法 2.1 形式化方法 该方法的思想是利用形式化语言&#xff0c;严格定义需求&#xff0c;并用数据推演的方法证明需求的性…

隐藏在Microsoft Designer背后的新科技,让人人都是设计师

编者按&#xff1a;在视觉图像设计中&#xff0c;用户的需求与最终的设计成品往往是“想象很美好&#xff0c;现实很骨感”。这通常是因为用户在与设计师沟通时&#xff0c;双方理解不一致&#xff0c;导致最终设计结果不尽如人意。但是&#xff0c;如果能够“自给自足”&#…

COMSOL晶体取向多晶材料Voronoi泰森多边形力学模拟

多晶材料几何模型模型构建采用的CAD Voronoi V2.3版本&#xff0c;可分图层对晶格进行绘制&#xff0c;分别导入有限元软件后实现三种晶体取向的差异性。 将构建好的Voronoi多晶体几何模型文件导入到COMSOL内&#xff0c;构建好晶体结构模型后&#xff0c;进行材料赋值操作&am…

Oracle常用傻瓜问题100问

大家在应用ORACLE的时候可能会遇到很多看起来不难的问题, 特别对新手来说, 今天我简单把它总结一下, 发布给大家, 希望对大家有帮助! 和大家一起探讨, 共同进步! 对ORACLE高手来说是不用看的. 1. Oracle安装完成后的初始口令? internal/oracle sys/change_on_install system/m…

Spring6《学习笔记(22版尚硅谷)》

Spring6 1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单…

io之socket编程

写在前面 本文通过socket编程来实现一个简单的HttpServer。 1&#xff1a;单线程版本 我们使用单线程来实现一个HttpServer&#xff0c;如下&#xff1a; package dongshi.daddy.io.httpserver;import java.io.PrintWriter; import java.net.ServerSocket; import java.net.…

何为儒家的四书五经?

中国古代的四书五经是儒家经典之一&#xff0c;是中国古代最为重要的经典之一。它们包括了四书&#xff1a;《大学》、《中庸》、《论语》、《孟子》以及五经&#xff1a;《诗经》、《尚书》、《礼记》、《周易》、《春秋》&#xff0c;被誉为“经国之宝”、“德育之本”。 四书…

java服务接入SkyWalking时生成TraceId信息(基于logback)

java服务生成TraceId 一、背景二、配置2.1 pom文件引入依赖2.2 logback-spring.xml配置 三、启动项目 一、背景 springboot服务接入SkyWalking时&#xff0c;想要在控制台输出TraceId信息&#xff0c;如下图的效果&#xff1a; 二、配置 参考文章&#xff1a; https://juej…

2023最全性能测试学习指南【建议收藏】

浅谈软件测试中的性能测试 很多时候&#xff0c;我们都知道软件有黑白盒测试&#xff0c;但往往还遗漏掉了一个性能测试。 在下面的这篇文章中&#xff0c;就带领大家来了解性能测试。一起来学习吧~ 学习目录 一、 性能测试概念 二、 性能测试指标 三、 性能测试种类 四、 性能…

“政会银企”齐聚纵目科技,探索四方合作新模式

近日&#xff0c;纵目科技携手浦东新区工商业联合会、浦东新区金融工作局、上海市人工智能行业协会、交通银行张江支行、招商银行上海分行外滩支行、中信银行上海漕河泾支行、中国建设银行张江分行举办了一场别开生面的“政会银企”座谈会&#xff0c;深入交流、探讨了推动四方…

并发编程学习(十四):tomcat线程池

1、Tomcat 功能组件结构 Tomcat 的核心功能有两个&#xff0c;分别是负责接收和反馈外部请求的连接器 Connector&#xff0c;和负责处理请求的容器 Container。 其中连接器和容器相辅相成&#xff0c;一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Servi…

同声传译方法有哪些?我来给你介绍三个同声传译的好方法

假设有一场国际性的会议&#xff0c;参会者来自不同的国家和语言背景。在会议中&#xff0c;主要的演讲和讨论都是以主持人或演讲者的母语进行&#xff0c;这个时候场中的其他人很可能因为语言不通而无法理解演讲的内容&#xff0c;而翻译人员人数不足的时候&#xff0c;就更难…

Nmap常用基础命令详解

阅读目录 Nmap 主机发现扫描 Nmap 使用扫描脚本 Nmap 内网服务扫描 Nmap 是免费开放源代码实用程序&#xff0c;用于网络发现和安全审核。许多系统和网络管理员还发现它对于诸如网络清单&#xff0c;管理服务升级计划以及监视主机或服务正常运行时间之类的任务很有用。Nmap以…