在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, (addprefix−p,(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, (addprefix−I,(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文件,就可以编译了