Android 编译系统AIDL模块出现couldn't find import for class出现错误

在Camera下新加了一个aidl文件,android.mk中也添加了

LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_SRC_FILES += src/com/xxx/xxx/xxx.aidl  // aidl文件路径

之前也以这种方法在系统中添加过aidl,也没问题,这次就出现了couldn’t find import for class的错误,也检查了aidl文件中的包名和路径是一致的。

在stackoverflow找到下面方法: 传送门

LOCAL_SRC_FILES := $(call all-java-files-under,src) $(call all-Iaidl-files-under, aidl)
LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl   // aidl文件路径
扩展:

编译由app根目录下的Android.mk控制,该文件下控制编译的是include $(BUILD_PACKAGE),一般这都是Android.mk的最后一句话,它的意思很简单,BUILD_PACKAGE是一个变量,定义在build/core/config.mk中,

BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk

它对应着package.mk这个文件,这个文件中有一系列的执行语句让make去执行,最终目标是生成apk,其中有一条语句就是

define transform-aidl-to-java
@mkdir -p $(dir $@)
@echo “Aidl: $(PRIVATE_MODULE) <= $<”
$(hide) ( A I D L ) − d (AIDL) -d (AIDL)d(patsubst %.java,%.P,$@) $(PRIVATE_AIDL_FLAGS) $< $@
endef

这个就是AIDL起作用的命令,将AIDL的文件转化成.java文件和.p文件,在android官网上我们可以看到各个参数所代表的意义,比如 -I 就是aidl文件中所需要import的类的位置,
比如aidl文件中import android.os.Bundle; 那么在aidl的执行语句中就要将 framework/base/core/java这段路径加进去,上面那段代码中并没有-I这个参数,它存在于变量PRIVATE_AIDL_FLAGS中,看它的定义:

$(aidl_java_sources): PRIVATE_AIDL_FLAGS := -b ( a d d p r e f i x − p , (addprefix -p, (addprefixp,(aidl_preprocess_import)) -I ( L O C A L P A T H ) − I (LOCAL_PATH) -I (LOCALPATH)I(LOCAL_PATH)/src ( a d d p r e f i x − I , (addprefix -I, (addprefixI,(LOCAL_AIDL_INCLUDES))

这里我们看到了-I,而且LOCAL_AIDL_INCLUDES就是定义了需要导入的路径的变量,在pathmap.mk中定义

LOCAL_AIDL_INCLUDES += $(FRAMEWORKS_BASE_JAVA_SRC_DIRS)

FRAMEWORKS_BASE_SUBDIRS :=
$(addsuffix /java,
core
graphics
location
media
media/mca/effect
media/mca/filterfw
media/mca/filterpacks
drm
opengl
sax
telephony
wifi
keystore
)

FRAMEWORKS_BASE_JAVA_SRC_DIRS :=
( a d d p r e f i x f r a m e w o r k s / b a s e / , (addprefix frameworks/base/, (addprefixframeworks/base/,(FRAMEWORKS_BASE_SUBDIRS))
看到这里我们可以看到,希望在aidl接口的函数中使用自己定义的类做参数,只需将该类实现Parcelable接口,并且将该类存放的路径加入到LOCAL_AIDL_INCLUDES中,同时在该类的同一目录下创建aidl文件,就可以编译了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值