AOSP中如何在Native代码中引入AIDL生成的头文件?
问题:Native模块引用AIDL生成头文件失败
我的/devices目录下有一个Native模块,结构如下:
- module -- aidl --- com ---- my ----- package ------ IMyInterface.aidl -- Android.mk -- Proxy.h -- Proxy.cpp
我希望在该模块中使用Binder,当前的Android.mk配置如下:
LOCAL_PATH := $(call my-dir) $(call emugl-begin-shared-library,libMyModule) LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl LOCAL_SRC_FILES := \ aidl/com/my/package/IMyInterface.aidl \ Proxy.cpp LOCAL_HEADER_LIBRARIES := libbinder_headers \ libhidlbase_impl_internal \ libbase LOCAL_SHARED_LIBRARIES := \ libbinder \ libutils \ liblog \ libcutils $(call emugl-export,C_INCLUDES,$(LOCAL_PATH)) $(call emugl-import,libOpenglCodecCommon$(GOLDFISH_OPENGL_LIB_SUFFIX)) $(call emugl-end-module)
编译时会生成C++头文件,但这些文件仅存在于中间目录:
$ ls out/target/product/emulator_x86_64/obj/SHARED_LIBRARIES/libMyModule_intermediates/aidl-generated/include/com/my/package: BnMyInterface.h BpMyInterface.h IMyInterface.h
直接在Proxy.cpp中添加#include "IMyInterface.h"时,编译系统报错:fatal error: 'IMyInterface.h' file not found,请问该如何正确引入这些头文件?
解决方案
1. 调整头文件引用路径并补充编译包含目录
步骤1:修改Proxy.cpp中的include语句
生成的头文件位于com/my/package子目录下,需要使用完整的相对路径引用:
#include "com/my/package/IMyInterface.h"
步骤2:在Android.mk中添加AIDL生成目录到编译路径
将AIDL生成的头文件根目录添加到编译系统的包含路径中,在Android.mk里新增以下配置:
# 把AIDL生成的include目录加入编译路径 LOCAL_C_INCLUDES += $(call local-generated-sources-dir)/aidl-generated/include
或者利用emugl-export指令来添加:
$(call emugl-export,C_INCLUDES,$(call local-generated-sources-dir)/aidl-generated/include)
添加后,编译系统就能通过你修改的路径找到对应的头文件。
2. 可选:供其他模块引用的配置(若有需求)
如果后续有其他模块需要引用这些AIDL生成的头文件,可以在Android.mk中添加导出配置:
LOCAL_EXPORT_C_INCLUDES := $(call local-generated-sources-dir)/aidl-generated/include
当前场景下,仅解决自身模块引用问题的话,第一种方案已足够。
内容的提问来源于stack exchange,提问作者artem
相关产品推荐
相关产品推荐

