對於NFC代碼編譯,目前爲止,我見過兩家不同方案商的書寫方式,都是在device下的XXXX.mk文件中書寫,XXXX不同的方案商不同的產品名稱不同。下面具體來看:
方式A:
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.nfc.xml:system/etc/permissions/android.hardware.nfc.xml
# NFC packages
PRODUCT_PACKAGES += \
libnfc \
libnfc_jni \
Nfc \
Tag
方式B:
#NXP NFC
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.nfc.xml:system/etc/permissions/android.hardware.nfc.xml
PRODUCT_PACKAGES += \
nfc.XXXX \
libnfc \
libnfc_jni \
Nfc \
Tag
對比這兩種方式,可以很明顯發現其中的不同點nfc.XXXX,下面就兩者的不同之處在分析:
nfc.XXXX 是nfc_hw.c 編譯生成的nfc.XXXX.so包,在out/目錄下。方式A中並沒有把nfc.XXXX放進去,它放在modules.mk中編譯。nfc_hw.c不同的方案也具體放在不同的位置。總之,它的目的是生成nfc.XXXX.so以供調用。
除了上述之外的東西,還需要在init.rc中配置:
# NFC
setprop ro.nfc.port "I2C"
至此,NFC編譯部分都配置完畢了。
通過以上的分析,NFC 在android 中的code 結構都差不多出來了,下面分析下:
客戶端:android提供了兩個API包給apk,分別是android.nfc.tech、android.nfc,實現了NFC的應用接口,代碼路徑frameworks/base/core/java/android/nfc/tech、frameworks/base/core/java/android/nfc。
服務端:packages/apps/Nfc是一個類似電話本的應用,這個程序在啓動後自動運行,並一直運行,作爲NFC的服務進程存在,是NFC的核心。
在這個程序代碼中,有個JNI庫,供NfcService調用,代碼路徑是packages/apps/Nfc/jni/.編譯文件中,還有個Tag部分,代碼路徑是packages/apps/Tag.
庫文件:代碼路徑是external/libnfc-nxp,用C編寫的庫文件,有兩個庫,分別是libnfc.so和libnfc_ndef.so。libnfc.so是一個主要的庫,實現了NFC stack的大部分功能,主要提供NFC的服務進程調用。libnfc_ndef是一個很小的庫,主要是實現NDEF消息的解析,供framework調用
nfc_hw.c:這個文件的具體路徑不確定。 pn544.c:這個文件是具體nfc芯片的驅動,一般都是drivers下。
由於本人初學,能力有限,有錯誤的地方歡迎指出。
參考文章: