先准备aidl文件,文件目录结果如下。
aidl文件内容,参见:【Android AIDL系列 1:手动编译aidl文件,生成Java、C++(android)、C++(ndk)、Rust接口】
$ tree
.
├── Android.bp
└── com
└── my
└── pkg
├── IMyServiceCallback.aidl
└── IMyServiceInterface.aidl
在Android源码里编译,关键是Android.bp文件。适用aidl_interface编译指令,可以支持4中后端语言接口:Java,cpp,ndk,rust。根据需要选择开启(enabled: true),生成对应语言的接口文件。
编译生成ndk的后端接口,关闭其他后端语言接口。
aidl_interface {
name: "MyServiceAidlInterface",
srcs: [ "com/my/pkg/*.aidl", ],
unstable: true,
backend: {
java: {
enabled: false,
platform_apis: true,
},
cpp: {
enabled: false,
},
ndk: {
enabled: true,
vndk: {
enabled: false,
},
},
},
}
源码中文件路径
.bp文件和.aidl文件在Android源码路径如下,这个路径是任选的。说明是为了下一步找到生成的接口文件。
$android_source/vendor/service/my_service
生成接口文件路径:
a
n
d
r
o
i
d
s
o
u
r
c
e
/
o
u
t
/
s
o
o
n
g
/
.
i
n
t
e
r
m
e
d
i
a
t
e
s
/
v
e
n
d
o
r
/
s
e
r
v
i
c
e
/
m
y
s
e
r
v
i
c
e
这个路径是编译时系统自动生成的。前半部分(
android_source/out/soong/.intermediates/vendor/service/my_service 这个路径是编译时系统自动生成的。 前半部分(
androidsource/out/soong/.intermediates/vendor/service/myservice这个路径是编译时系统自动生成的。前半部分(android_source/out/soong/.intermediates/)是Android源码编译生成的中间文件所在目录,后半部分(vendor/service/my_service)是对应的.aidl文件在源码中的目录。
编译后生成4个文件夹,其中带“-source”后缀的2个文件夹中,包含头文件和源码文件,另外两个文件夹中是编译过程中的.o文件和编译完成的动态库.so文件。
MyServiceAidlInterface-ndk-source和MyServiceAidlInterface-ndk_platform-source目录下源码是一样的,diff没有差别。生成的二进制文件是不同的。(TODO 这个和platform_apis的关系还不确定,ndk的后端没有platform_apis的属性。还是对于ndk来说,platform_apis是必须开启的?)
分类 | 源码 | 二进制 |
---|
MyServiceAidlInterface-ndk | MyServiceAidlInterface-ndk-source | MyServiceAidlInterface-ndk |
MyServiceAidlInterface-ndk_platform | MyServiceAidlInterface-ndk_platform-source | MyServiceAidlInterface-ndk_platform |
ndk生成结果
$ ls -1
MyServiceAidlInterface-ndk
MyServiceAidlInterface-ndk-source
MyServiceAidlInterface-ndk_platform
MyServiceAidlInterface-ndk_platform-source
$ find . -name *.cpp
./MyServiceAidlInterface-ndk-source/gen/com/my/pkg/IMyServiceCallback.cpp
./MyServiceAidlInterface-ndk-source/gen/com/my/pkg/IMyServiceInterface.cpp
./MyServiceAidlInterface-ndk_platform-source/gen/com/my/pkg/IMyServiceCallback.cpp
./MyServiceAidlInterface-ndk_platform-source/gen/com/my/pkg/IMyServiceInterface.cpp
$ find . -name *.h
./MyServiceAidlInterface-ndk-source/gen/include/aidl/com/my/pkg/BpMyServiceCallback.h
./MyServiceAidlInterface-ndk-source/gen/include/aidl/com/my/pkg/BpMyServiceInterface.h
./MyServiceAidlInterface-ndk-source/gen/include/aidl/com/my/pkg/IMyServiceInterface.h
./MyServiceAidlInterface-ndk-source/gen/include/aidl/com/my/pkg/BnMyServiceInterface.h
./MyServiceAidlInterface-ndk-source/gen/include/aidl/com/my/pkg/BnMyServiceCallback.h
./MyServiceAidlInterface-ndk-source/gen/include/aidl/com/my/pkg/IMyServiceCallback.h
./MyServiceAidlInterface-ndk_platform-source/gen/include/aidl/com/my/pkg/BpMyServiceCallback.h
./MyServiceAidlInterface-ndk_platform-source/gen/include/aidl/com/my/pkg/BpMyServiceInterface.h
./MyServiceAidlInterface-ndk_platform-source/gen/include/aidl/com/my/pkg/IMyServiceInterface.h
./MyServiceAidlInterface-ndk_platform-source/gen/include/aidl/com/my/pkg/BnMyServiceInterface.h
./MyServiceAidlInterface-ndk_platform-source/gen/include/aidl/com/my/pkg/BnMyServiceCallback.h
./MyServiceAidlInterface-ndk_platform-source/gen/include/aidl/com/my/pkg/IMyServiceCallback.h
Java后端接口的编译结果
$ ls -1
MyServiceAidlInterface-java
MyServiceAidlInterface-java-source
$ find . -name *.java
./MyServiceAidlInterface-java-source/gen/com/my/pkg/IMyServiceInterface.java
./MyServiceAidlInterface-java-source/gen/com/my/pkg/IMyServiceCallback.java
生成cpp、rust后端情况类似,不再重复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)