標籤:如何 one wrap 原生態 靜態 classname 兩種 initial 相關
在給Android添加新的驅動後,app要如何使用呢?
正常的使用一個裝置,需要getService。但是像LED等我們自己添加的硬體驅動,Android原始碼根本沒有我們自己添加的服務。
第一種:
我們自己的建立的硬體裝置驅動的類是被系統定義為了隱藏類,那麼在Android系統中如何使用隱藏類呢?為此我們可以根據android的編譯過程可以看到我們添加的類被添加到framework.jar。但是framework.jar是dex格式,在我們做app時要使用原生態的jar目標檔案.
所以我們使用 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/class.jar這個jar檔案。
如何包含jar檔案,我們可以Google。
第一步,把jar包放在工程下的libs目錄裡,如果沒有就建立這個目錄。
第二步,通過File菜單或者F4進入project structure,先在左上方選擇+號,然後添加class.jar,然後左邊選中app,再進到dependencies,點 + 選擇file dependency ,再從libs目錄選擇你要的jar包,選擇後把 scope置為Provide。即可。 第二種:通過反射來建立我們建立的類。也就是不用匯入class.jar檔案就能實現對我們自訂的類的建立和函數調用。我個人的理解就是使用 Class.forName靜態函數,通過已知的函數名來實現對函數的調用。
Class.forName:返回與給定的字串名稱相關聯類或介面的Class對象。
Class.forName是一個靜態方法,同樣可以用來載入類。該方法有兩種形式:Class.forName(String name, boolean initialize, ClassLoader loader)和 Class.forName(String className)。第一種形式的參數 name表示的是類的全名;initialize表示是否初始化類;loader表示載入時使用的類載入器。第二種形式則相當於設定了參數 initialize的值為 true,loader的值為當前類的類載入器。
static Class <?>
|
forName( String className) Returns the Class object associated with the class or interface with the given string name. |
static Class <?>
|
forName( String name, boolean initialize, ClassLoader loader) Returns the Class object associated with the class or interface with the given string name, using the given class loader. |
通過類名擷取類。
Class serviceManager = Class.forName("android.os.ServiceManager");
擷取方法
Method method = serviceManager.getMethod("getService", String.class);
調用方法
method.invoke(serviceManager.newInstance(), "phone");
()http://blog.csdn.net/fengyuzhengfan/article/details/38086743
Android驅動學習-APP操作新硬體的兩種方法(支援添加的驅動)