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

时间:2014-11-25 23:47:50

标签: android aidl

我知道有关于stackoverflow和其他地方(例如谷歌小组)的多个问题,关于为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但它没有帮助。

想法?

6 个答案:

答案 0 :(得分:9)

最后我解决了。

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

$(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

答案 1 :(得分:3)

所以我环顾四周 - 解决方案是将AIDL文件只放入他们自己的名为aidl的目录中,我认为其他一些人建议这样做。

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

我不明白。我只是没有得到它。 AIDL导入在Eclipse中完美运行。 Android Studio尚未准备就绪。这是倒退的重要一步。

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

精氨酸!

答案 2 :(得分:1)

好的,所以我几天都在苦苦寻找同样的问题。清洁/重建并不适合我。最后,我意识到我在Android Studio中犯了一个非常简单的错误 - 当我右键单击鼠标并创建一个新的" AIDL"时,我没有点击相应的文件夹作为我的原始模型类。

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

答案 3 :(得分:0)

只需要将.aidl文件命名为.java文件!

答案 4 :(得分:0)

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

为解决此问题,我从IPackageStatsObserver的示例中使用了可打包的PackageStats。

所有导入必须在.aidl文件中声明,如果我们在C语言中,则必须以.h声明。

这是PackageStats.aidl文件的内容,反映出存在相同名称的类(在Java端):

package android.content.pm;

parcelable PackageStats;

因此,我在.aidl中声明了所有可打包的内容,对于我需要在我的aidl接口中使用的每个匹配.java,然后编译它。

看看它现在是否真的可以工作了;)

答案 5 :(得分:0)

要解析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 {
...