Android Aidl 编译错误:找不到类的导入

问题描述 投票:0回答:7

我知道在 stackoverflow 和其他地方(比如 google group)上有很多关于为 NetworkInfo 添加 Parcelable 的问题,但这不是这个问题。

我的工作位于 $(AOSP_ROOT)/device/ 下,涉及多个 aidl 文件。其中之一就像,

package com.example;

parcelable SomeRequest;

另一个援助就像,

package com.example;

import com.example.SomeRequest;
interface SomeService {
    SomeRequest getRequest();
}

我会得到类似的编译错误,

device/somedevice/sdk/libs/aidl/com/example/SomeService.aidl:9: couldn't find import for class com.example.SomeRequest

我想知道这是处理aidl文件的顺序。我的 Android.mk 看起来像,

LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, aidl)
LOCAL_AIDL_INCLUDES := $(call all-Iaidl-files-under, aidl)

这个构建错误是在我将aidl文件从src/文件夹移动到aidl/文件夹后引入的(由于某种原因我必须这样做)。它以前可以工作,但现在即使我将其移回 src/ 文件夹,它也不再工作了。我尝试清理 $(AOSP_ROOT)/out/device/target 但没有帮助。

想法?

android aidl
7个回答
11
投票

终于解决了。

如果你深入研究

/build/core/base_rules.mk
,你会发现
LOCAL_AIDL_INCLUDES
实际上是AIDL编译阶段除了framework等默认文件夹之外要包含的文件夹。

$(aidl_java_sources): PRIVATE_AIDL_FLAGS := -b $(addprefix -p,$(aidl_preprocess_import)) -I$(LOCAL_PATH) -I$(LOCAL_PATH)/src $(addprefix -I,$(LOCAL_AIDL_INCLUDES))

在这个具体情况下,你想要的实际上是,

LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, aidl)
LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl

5
投票

所以我环顾四周 - 解决方案是将 AIDL 文件仅放入它们自己的名为 aidl 的目录中,我认为其他人已经建议了。

事实证明,Android Studio 会查看那里,但不太知道如何处理放在 src 目录中的 .aidl 文件。

我不明白。我就是不明白。 AIDL 导入在 Eclipse 中运行良好。 Android Studio 尚未做好生产准备。这是一个重大倒退。

我在让 AIDL 编译器查找导入时也遇到了麻烦,我认为必须有一种比修改平台管理的 base_rules.mk 更好的方法。

精氨酸!


2
投票

好吧,我花了好几天的时间试图解决同样的问题。清理/重建对我不起作用。最终,我意识到我在 Android Studio 中犯了一个非常简单的错误 - 当我右键单击鼠标并创建一个新的“AIDL”时,我没有单击相应的文件夹作为我的原始模型类。

例如,我的模型位于名为 com.example.model 的 java 包中,但在创建 AIDL 时我没有在该文件夹中右键单击。因此,当 Android Studio 为我生成 AIDL 文件夹时,它会引用错误的文件夹,最终会出现编译错误。我希望 android 文档清楚地表明我们需要在生成 AIDL 文件之前右键单击相应的文件夹。我知道,这听起来很愚蠢,但我希望这个答案适用于你们中的一些人!


2
投票

截至目前,当前接受的答案不再是一种选择。 Android Studio 3.4 中没有 base_rules.mk 文件,无论如何我都找不到。

为了解决这个问题,我从 IPackageStatsObserver 中获取了一个使用 Parcelable PackageStats 的示例。

所有导入都必须在 .aidl 文件中声明,如果我们在 C 中,则为某种 .h。

这里是PackageStats.aidl文件的内容,反映了存在同名的类(在java端):

package android.content.pm;

parcelable PackageStats;

因此,我在 .aidl 中声明了所有的 Parcelable,对于我需要在我的 AIDL 接口中使用的每个匹配的 .java,瞧,它编译了。

看看现在是否真的有效;)


1
投票

只需将 .aidl 文件命名为与 .java 文件相同即可!


1
投票

要解决

couldn't find import for class
类中的
parcelable
,请将aild文件和java文件放在正确的包和文件夹中

// MyObject.aidl
package com.example.androidaidlserver.model;
parcelable MyObject;
// ILocalLogService.aidl
package com.example.androidaidlserver;

import com.example.androidaidlserver.model.MyObject;

interface ILocalLogService {

    void writeObject(in MyObject log);
}
// MyObject.java
package com.example.androidaidlserver.model;

import android.os.Parcel;
import android.os.Parcelable;

public class MyObject implements Parcelable {
...

0
投票

对于截至 2023 年仍然遇到此问题的任何人,只需将 AIDL 文件直接放入 aidl 文件夹中,无需任何包层次结构,但不要更改 aidl 文件本身内的包声明。

© www.soinside.com 2019 - 2024. All rights reserved.