(我知道有关于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但它没有帮助。
想法?
答案 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 {
...