国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[Android AIDL系列 1] 手動(dòng)編譯aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口

這篇具有很好參考價(jià)值的文章主要介紹了[Android AIDL系列 1] 手動(dòng)編譯aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

AIDL文件在Android系統(tǒng)上應(yīng)用廣泛,和底層的Binder機(jī)制緊密關(guān)聯(lián)。
在Android源碼或者Android Studio中通常是自動(dòng)編譯aidl文件,生成對(duì)應(yīng)語(yǔ)言的接口文件。
做應(yīng)用層Java開(kāi)發(fā),aidl和binder封裝的比較“干凈”,不用太多的涉及binder的調(diào)用細(xì)節(jié),也不用太關(guān)心aidl的編譯過(guò)程。
如果是做中下層開(kāi)發(fā),包括framework、native層開(kāi)發(fā),可能需要編寫(xiě)native service,有必要理解binder的底層機(jī)制。

先從編譯aidl開(kāi)始。這里只說(shuō)明編譯aidl生成各種類(lèi)型后端接口文件的過(guò)程。生成的接口文件內(nèi)容再寫(xiě)文章單獨(dú)介紹。

以下演示是在Ubuntu系統(tǒng)上測(cè)試的。

一、準(zhǔn)備

1. aidl編譯工具

即aidl命令,Android sdk或者Android源碼中都有。

sdk中aidl,需要把路徑添加到path中。
位置:~/Android/Sdk/build-tools/33.0.2/aidl

源碼中aidl,設(shè)置源碼編譯環(huán)境后,自動(dòng)添加到path中。
位置:out/soong/host/linux-x86/bin/aidl

2. 演示用的aidl文件

寫(xiě)2個(gè)簡(jiǎn)單的aidl文件,一個(gè)是服務(wù)接口,一個(gè)是回調(diào)接口??捎酶采w大部分的實(shí)際場(chǎng)景。
文件目錄結(jié)構(gòu)和文件內(nèi)容如下。

$ tree .
.
└── aidl
    └── com
        └── my
            └── pkg
                ├── IMyServiceCallback.aidl
                └── IMyServiceInterface.aidl

回調(diào)接口定義:

// IMyServiceCallback.aidl
package com.my.pkg;

 interface IMyServiceCallback {
    void onEvent(int code, String message);
}

服務(wù)接口定義:

// IMyServiceInterface
package com.my.pkg;

interface IMyServiceInterface {
    int doSomething(in String str, int num);
    void setCallBack(com.my.pkg.IMyServiceCallback callback);
}

二、生成Java接口

執(zhí)行如下命令,生成Java接口文件。
說(shuō)明:

  1. aidl使用說(shuō)明
    aidl --lang={java|cpp|ndk} [options] input_aidl_file。
    在命令行中,aidl不帶任何參數(shù),打印使用說(shuō)明。
  2. –lang={java|cpp|ndk}
    指定生成接口類(lèi)型。如果不指定,默認(rèn)生成Java文件。
  3. -o 指定輸出目錄
    Java:省略-o參數(shù),java文件生成到aidl文件目錄下。
    C++/Rust:必選參數(shù)。
    為了清除查看效果,指定到單獨(dú)的目錄:-o ./java
  4. -I DIR, --include=DIR
    import搜索路徑,指定依賴(lài)的aidl文件所在目錄。不是C++頭文件目錄。
    例如:IMyServiceInterface.aidl引用了IMyServiceCallback.aidl,在生成IMyServiceInterface.aidl的時(shí)候需要指定-I參數(shù)才能正常編譯。
    只要是AIDL文件中有依賴(lài),生成任何類(lèi)型的接口(Java、C++、Rust)都要指定這個(gè)參數(shù)。
# 前2條命令效果相同,不指定--lang參數(shù),默認(rèn)生成Java文件
$ aidl -o ./java --lang=java aidl/com/my/pkg/IMyServiceCallback.aidl 
$ aidl -o ./java aidl/com/my/pkg/IMyServiceCallback.aidl 

$ aidl -I ./aidl/ -o ./java aidl/com/my/pkg/IMyServiceInterface.aidl

$ tree 
.
├── aidl
│   └── com
│       └── my
│           └── pkg
│               ├── IMyServiceCallback.aidl
│               └── IMyServiceInterface.aidl
└── java
    └── com
        └── my
            └── pkg
                ├── IMyServiceCallback.java
                └── IMyServiceInterface.java

三、生成C++[Android]接口

  1. cpp和ndk的區(qū)別
    cpp:生成的代碼是為了在Android源碼中編譯,代碼中會(huì)調(diào)用Android源碼中的native接口。
    例如,引用的頭文件:
    <binder/IBinder.h>,<binder/IInterface.h>,<binder/Status.h>,<android-base/macros.h>

    ndk:生成的代碼是為了使用ndk獨(dú)立編譯,調(diào)用的是ndk的接口,
    例如,引用的頭文件:
    <android/binder_interface_utils.h> <android/binder_ibinder.h>

  2. –lang=cpp,參數(shù)指定生成Android源碼下編譯的C++接口文件。

  3. -o和-h參數(shù)分別指定.cpp文件和.h文件輸出的路徑??梢灾付ú煌哪夸?。
    1)C++接口文件比較多,一個(gè)aidl文件生成4個(gè)文件。第一步編譯IMyServiceCallback.aidl后,生成文件包括:
    3個(gè)頭文件:
    一個(gè)Interface頭文件:IMyServiceCallback.h
    一個(gè)Bp頭文件:BpMyServiceCallback.h
    一個(gè)Bn頭文件:BnMyServiceCallback.h
    一個(gè)源碼文件:IMyServiceCallback.cpp

$ aidl -h ./cpp_android/ -o ./cpp_android --lang=cpp aidl/com/my/pkg/IMyServiceCallback.aidl
$ tree 
.
├── aidl
│   └── com
│       └── my
│           └── pkg
│               ├── IMyServiceCallback.aidl
│               └── IMyServiceInterface.aidl
└── cpp_android
    └── com
        └── my
            └── pkg
                ├── BnMyServiceCallback.h
                ├── BpMyServiceCallback.h
                ├── IMyServiceCallback.cpp
                └── IMyServiceCallback.h

$ aidl -I ./aidl/ -h ./cpp_android/ -o ./cpp_android --lang=cpp aidl/com/my/pkg/IMyServiceInterface.aidl
$ tree 
.
├── aidl
│   └── com
│       └── my
│           └── pkg
│               ├── IMyServiceCallback.aidl
│               └── IMyServiceInterface.aidl
└── cpp_android
    └── com
        └── my
            └── pkg
                ├── BnMyServiceCallback.h
                ├── BnMyServiceInterface.h
                ├── BpMyServiceCallback.h
                ├── BpMyServiceInterface.h
                ├── IMyServiceCallback.cpp
                ├── IMyServiceCallback.h
                ├── IMyServiceInterface.cpp
                └── IMyServiceInterface.h

四、生成C++[ndk]接口

除了–lang=ndk指定生成ndk后端接口,過(guò)程和結(jié)果都和cpp類(lèi)似。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-478191.html

$ aidl -I ./aidl/ -h ./cpp_ndk -o ./cpp_ndk --lang=ndk aidl/com/my/pkg/IMyServiceInterface.aidl 
$ aidl -h ./cpp_ndk -o ./cpp_ndk --lang=ndk aidl/com/my/pkg/IMyServiceCallback.aidl 

$ tree cpp_*
cpp_android
└── com
    └── my
        └── pkg
            ├── BnMyServiceCallback.h
            ├── BnMyServiceInterface.h
            ├── BpMyServiceCallback.h
            ├── BpMyServiceInterface.h
            ├── IMyServiceCallback.cpp
            ├── IMyServiceCallback.h
            ├── IMyServiceInterface.cpp
            └── IMyServiceInterface.h
cpp_ndk
├── aidl
│   └── com
│       └── my
│           └── pkg
│               ├── BnMyServiceCallback.h
│               ├── BnMyServiceInterface.h
│               ├── BpMyServiceCallback.h
│               ├── BpMyServiceInterface.h
│               ├── IMyServiceCallback.h
│               └── IMyServiceInterface.h
└── com
    └── my
        └── pkg
            ├── IMyServiceCallback.cpp
            └── IMyServiceInterface.cpp

五、生成Rust接口文件

  1. –lang=rust指定生成rust后端接口文件。
  2. 只需通過(guò)-o參數(shù)設(shè)置輸出路徑即可,輸出結(jié)果和Java類(lèi)似,一個(gè)aidl文件對(duì)應(yīng)一個(gè).rs文件。
  3. Rust后端是比較新版本的aidl才支持的,可能是Android 12以后,可以查看aidl命令幫助確認(rèn)。
$ aidl -o ./rust --lang=rust aidl/com/my/pkg/IMyServiceCallback.aidl 
$ aidl -I ./aidl/ -o ./rust --lang=rust aidl/com/my/pkg/IMyServiceInterface.aidl

$ tree 
.
├── aidl
│   └── com
│       └── my
│           └── pkg
│               ├── IMyServiceCallback.aidl
│               └── IMyServiceInterface.aidl
└── rust
    └── com
        └── my
            └── pkg
                ├── IMyServiceCallback.rs
                └── IMyServiceInterface.rs

到了這里,關(guān)于[Android AIDL系列 1] 手動(dòng)編譯aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [Android AIDL] --- AIDL工程搭建

    [Android AIDL] --- AIDL工程搭建

    AIDL(Android Interface Definition Language)是一種 IDL 語(yǔ)言,用于生成可以在 Android 設(shè)備上兩個(gè)進(jìn)程之間進(jìn)行進(jìn)程間通信(IPC)的代碼。 通過(guò) AIDL,可以在一個(gè)進(jìn)程中獲取另一個(gè)進(jìn)程的數(shù)據(jù)和調(diào)用其暴露出來(lái)的方法,從而滿(mǎn)足進(jìn)程間通信的需求。通常,暴露方法給其他應(yīng)用進(jìn)行調(diào)用的

    2024年02月10日
    瀏覽(24)
  • Android AIDL基本使用

    Android AIDL基本使用

    AIDL是Android多進(jìn)程通訊方式一種。 如要使用 AIDL 創(chuàng)建綁定服務(wù),請(qǐng)執(zhí)行以下步驟: 創(chuàng)建 .aidl 文件 此文件定義帶有方法簽名的編程接口。 實(shí)現(xiàn)接口 Android SDK 工具會(huì)基于您的? .aidl ?文件,使用 Java 編程語(yǔ)言生成接口。此接口擁有一個(gè)名為? Stub ?的內(nèi)部抽象類(lèi),用于擴(kuò)展? B

    2024年02月09日
    瀏覽(19)
  • Android:AIDL實(shí)戰(zhàn)詳解

    Android:AIDL實(shí)戰(zhàn)詳解

    AIDL:Android Interface Definition Language AIDL是為了實(shí)現(xiàn)進(jìn)程間通信而設(shè)計(jì)的Android接口語(yǔ)言 Android進(jìn)程間通信有多種方式,Binder機(jī)制是其中最常見(jiàn)的一種 AIDL的本質(zhì) 就是基于對(duì)Binder的運(yùn)用從而實(shí)現(xiàn)進(jìn)程間通信 這篇博文從實(shí)戰(zhàn)出發(fā),用一個(gè)盡可能精簡(jiǎn)的Demo,實(shí)現(xiàn)兩個(gè)App (也是兩個(gè)進(jìn)程:

    2024年02月08日
    瀏覽(16)
  • android aidl進(jìn)程間通信封裝通用實(shí)現(xiàn)

    接上一篇的分析,今天繼續(xù) aidl復(fù)雜流程封裝-CSDN博客 今天的任務(wù)就是將代碼梳理下放進(jìn)來(lái) 1 項(xiàng)目gradle配置: ? ?需要將對(duì)應(yīng)的代碼放到各自的目錄下,這里僅貼下關(guān)鍵內(nèi)容,細(xì)節(jié)可以下載代碼慢慢看 ? ? sourceSets { ? ? ? ? main { ? ? ? ? ? ? manifest.srcFile \\\'src/main/AndroidManife

    2024年02月22日
    瀏覽(20)
  • Android Binder——APP中AIDL實(shí)現(xiàn)(十九)

    ????????AIDL(Android Interface Definition Language)其實(shí)就是對(duì) Binder 通信的一個(gè)封裝,方便在開(kāi)發(fā)中對(duì) Binder 通信的使用,這里我們就從頭開(kāi)始來(lái)看一下 AIDL 通信的創(chuàng)建過(guò)程。 ????????通過(guò) Android Studio 的 File -New - AIDL 的方式就會(huì)生成對(duì)應(yīng)包名的 aidl 文件。即 aidl 文件要與應(yīng)用

    2024年04月28日
    瀏覽(36)
  • 深入解析Android AIDL:實(shí)現(xiàn)跨進(jìn)程通信的利器

    深入解析Android AIDL:實(shí)現(xiàn)跨進(jìn)程通信的利器

    Android Interface Definition Language (AIDL) 是一種Android系統(tǒng)中的跨進(jìn)程通信機(jī)制。AIDL允許一個(gè)應(yīng)用程序的組件與另一個(gè)應(yīng)用程序的組件通信,并在兩者之間傳輸數(shù)據(jù)。 AIDL的主要作用是幫助不同進(jìn)程間共享數(shù)據(jù)和服務(wù),讓他們能夠互相調(diào)用。例如,在開(kāi)發(fā)一個(gè)多功能的音樂(lè)播放器時(shí),

    2024年02月19日
    瀏覽(24)
  • Android中AIDL的簡(jiǎn)單使用(Hello world)

    Android中AIDL的簡(jiǎn)單使用(Hello world)

    AIDL:Android Interface Definition Language(Android接口定義語(yǔ)言) 作用:跨進(jìn)程通訊。如A應(yīng)用調(diào)用B應(yīng)用提供的接口 A應(yīng)用創(chuàng)建aidl接口,并且創(chuàng)建一個(gè)Service來(lái)實(shí)現(xiàn)這個(gè)接口(在onBind方法里面return我們這個(gè)接口的實(shí)例)。 把A應(yīng)用創(chuàng)建的aidl文件原封不動(dòng)的搬至B應(yīng)用中(注意包名類(lèi)名都

    2024年02月11日
    瀏覽(24)
  • android aidl進(jìn)程間通信封裝通用實(shí)現(xiàn)-用法說(shuō)明

    接上一篇:android aidl進(jìn)程間通信封裝通用實(shí)現(xiàn)-CSDN博客 該aar包的使用還是比較方便的 一先看客戶(hù)端 1 初始化 2 發(fā)送事件: ?就是通過(guò)json的形式將參數(shù)包裹進(jìn)來(lái),另一端統(tǒng)一解析 ?唯一標(biāo)志位:KEY_CLIENT_REQUEST_AUTHOR 是必須要加的,不然區(qū)分不出來(lái)是那個(gè)客戶(hù)端 二再看服務(wù)端

    2024年02月20日
    瀏覽(21)
  • Android:AIDL簡(jiǎn)單介紹+傳遞簡(jiǎn)單數(shù)據(jù)+傳遞復(fù)雜數(shù)據(jù)

    Android:AIDL簡(jiǎn)單介紹+傳遞簡(jiǎn)單數(shù)據(jù)+傳遞復(fù)雜數(shù)據(jù)

    對(duì)于AIDL的學(xué)習(xí),這些也只能說(shuō)是我在學(xué)習(xí)中的理解,有理解不到位或者錯(cuò)的地方也歡迎指正。 AIDL的目的就是實(shí)現(xiàn)進(jìn)程之間的通信, 尤其是在涉及多進(jìn)程并發(fā)情況下的進(jìn)程間通信 ??梢詫idl理解為兩個(gè)進(jìn)程之間的橋梁,并制定規(guī)則,使其傳輸特定數(shù)據(jù)。 1.AIDL支持的數(shù)據(jù)類(lèi)型

    2024年02月21日
    瀏覽(19)
  • Android Binder常用案例使用分析,跨進(jìn)程通信aidl

    Android Binder常用案例使用分析,跨進(jìn)程通信aidl

    service組件的binderService獲取binder通信。 servicemanager.getService方法獲取相關(guān)服務(wù)。 本質(zhì)上都是IBinder通信。 客戶(hù)端:使用intent,啟動(dòng)服務(wù)端的service,使用binderservice,在onServiceConnected回調(diào)方法中獲取服務(wù)端的實(shí)際binder對(duì)象。使用aidl中的接口調(diào)用服務(wù)端的方法即可。 服務(wù)端:定義

    2024年02月07日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包