天天看點

AIDL 編譯報couldn't find import for class原因探究

 有如下AIDL代 碼:

 package android.hardware;

 import android.content.Context;

 interface IEinkctlService

 {

  boolean updateModeLock(boolean acquired, Context context);

  int retrieveWorkMode();

  boolean switchWorkMode(int mode);

 }

 編譯時總是提示 couldn't find import for class android.content.Context

 似乎是找不到Context 類,而實際上我們都知道android.content.Context确實是存在的。

 上網搜尋一番,發現遇到此問題的人不少。

 其實,要明白這個問 題需要先搞清楚什麼樣的類是需要且可以import進AIDL中的。

  參考 《Android/OPhone開發完全講義》第8章裡的一段叙述:

“AIDL服務隻支援有限的資料類型,是以,如果用AIDL服 務傳遞一些複雜的資料就需要做更一步處理。AIDL服務支援的資料類型如下:

Java的簡單類 型(int、char、boolean等)。不需要導入(import)。

String和 CharSequence。不需要導入(import)。

List和 Map。但要注意,List和Map對象的元素類型必須是AIDL服務支援的資料類型。不需要導入(import)。

AIDL自動生成 的接口。需要導入(import)。

實作 android.os.Parcelable接口的類。需要導入(import)。

其中後兩種資料類 型需要使用import進行導入,将在本章的後面詳細介紹。

傳遞不需要 import的資料類型的值的方式相同。傳遞一個需要import的資料類型的值(例如,實作android.os.Parcelable接口的類)的步 驟略顯複雜。除了要建立一個實作android.os.Parcelable接口的類外,還需要為這個類單獨建立一個aidl檔案,并使用 parcelable關鍵字進行定義。”

到此應該很清楚 了,Context類并不是一個實作了Parcelable接口的類,也沒有對應的AIDL檔案,是以不能夠在AIDL中import。

補充一句,網上有一種 “辦法”,說是在frameworks/base/Android.mk中的LOCAL_AIDL_INCLUDES := $(FRAMEWORKS_BASE_JAVA_SRC_DIRS)前加上LOCAL_AIDL_INCLUDES := 欲import的類所在位置。其實這種“辦法”也是受上面所說的import規則限制的。一個沒有實作Parcelable接口的類,這種“辦法”也是無 能為力的。