怎樣寫一個相似ROS的易用的android機器人框架(2)java
參考項目源碼android
咱們實現了相似ROS系統的節點註冊和消息轉發機制,在這個機制中,節點自定義的消息封裝在Bundle
對象中,這樣每一個節點的 publish()
都統一了,可是也有很差的,用起來就沒那麼方便,咱們更但願定義本身的消息類,將一些複雜的數據填入這個類對象中,而後發佈,如機器人馬達的數據,能夠定義:git
data class MsgMotor(@JvmField var L: Int = 0, @JvmField var R: Int = 0)
轉換成Bundle就得這麼寫app
Bundle().apply { putInt("L", xxx.L) putInt("R",xxx.R) }
其餘節點接收到這個消息時又得反向解析一遍,很麻煩 可否簡單解決呢?框架
apt能夠掃描源碼中特定的註解,並根據註解生成特定的代碼,所以咱們開發apt工具庫,而後在讓編譯腳本調用這個工具庫幫咱們生成這些轉換代碼。源碼目錄下ide
dependencies { compile project(":easyAptApi") //指定 apt kapt project(":easyAptProcessor") }
@MessageType("") data class MsgMotor(@JvmField var L: Int = 0, @JvmField var R: Int = 0)
public final class ConvertMsgMotor { public static Bundle toBundle(MsgMotor msgmotor) { Bundle b = new Bundle(); try { b.putInt("L", msgmotor.L); b.putInt("R", msgmotor.R); } catch (Exception e) { e.printStackTrace(); } return b; } public static MsgMotor toMsg(Bundle b) { MsgMotor r = new MsgMotor(); try { r.L = b.getInt("L"); r.R = b.getInt("R"); } catch (Exception e) { e.printStackTrace(); } return r; } }
使用這個ConvertMsgMotor便可實現MsgMotor與Bundle之間的相互轉換了。函數
dependencies { compile project(':easyAptApi') compile 'com.google.auto.service:auto-service:1.0-rc2' compile 'com.squareup:javapoet:1.9.0' }
processor的主類須要實現 AbstractProcessor
接口,並添加註解 @AutoService(Processor::class)
,這是com.google.auto.service中的註解,用來生成apt插件庫工具
須要定義 resource 目錄下的 META-INF/services/javax.annotation.processing.Processor文件,填寫主類的完整包名和類名,不然編譯腳本將沒法搜索到這個插件類gradle
AbstractProcessor
的全部方法這樣,一個根據註解自動生成代碼的apt插件庫機完成了google