Java有很多第三方庫。Android的Dalvik虛擬器不完全是Java,也就是Android SDK和傳統的SDK不完全一樣,如果Java庫相容Android,則可被利用。Java庫使用受限於下面因素:
- 目標平台:Java代碼適配版本是否比Android基於的Java版本更高。是否用了Android不支援的Java SE的API,例如Swing、AWT圖形。
- Size:為案頭或者伺服器設計的Java代碼不需要考慮儲存和記憶體空間,Android需要,使用第三方Java代碼,可能會是應用Size無法容忍。
- 效能:Java代碼是否要消耗Android裝置所能提供的CPU。
- 介面:Java代碼是否需要console介面,或者可以封裝我們自己介面中的單純API。
解決方式之一是使用開源java代碼,使他們變得更適合Android。例如只需使用10%的第三方庫,可以重新編譯,去除不必要的類。
不是所有的Java代碼可以在Android或者Dalvik上運行,Android沒有提供某些在Java SE/ME/EE上的API,例形相關的Swing和AWT。此外Java代碼可以依賴其他Java代碼,例如Jar中依賴不同於Android整合的Apache HttpComponents,可能會引發相容問題。在這些情況下,當我們引入第三方jar包進行編譯的時候沒有問題,但是在運行應用是出錯。因此使用開原始碼是最好的解決方案。
有兩種方法整合第三方代碼,使用原始碼或者使用預先封裝好的jar。如果使用原始碼,將其放入我們代碼樹中一起編譯。下面介紹使用jar的方式。
加入第三方jar
如果使用現成的jar,將jar放在Android項目的libs/目錄下,在命令列ant的編譯方式中,會自動將尋找libs/的jar文檔。如果使用IDE開發,例如Eclipse,需要將JAR加入到bulid path中。在左邊樹狀列表中,點擊所需載入jar的項目,按右鍵->Build Path –>Add External Archives…,加入jar包即可。
在例子中,使用BeanShell的bsh-core-2.0b4.jar,BeanShell是提供指令碼方式,可以按java的語句格式來編寫指令碼。下載,並安裝後,在Eclipse成功加入jar文檔,如右圖所示。BeanShell使用很簡單,將在例子中建設。
原始碼
加入jar後,其他和常規的做法沒有什麼區別,代碼如下:
... ...
import bsh.Interpreter; //可通過 Ctrl + Shif + O自動加上
public class Chapter24Test1 extends Activity{
//BeanShell使用步驟1:建立一個BeanShell Interpreter的執行個體
private Interpreter i = new Interpreter();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chapter_24_test1);
Button button = (Button)findViewById(R.id.c24_eval);
final EditText script = (EditText)findViewById(R.id.c24_script);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String src= script.getText().toString();
try{
//BeanShell第2步:設定指令碼的全域
i.set("context",Chapter24Test1.this);
//BeanShell第3步:設定指令碼,可選的擷取指令碼的最後狀態。
i.eval(src);
}catch(bsh.EvalError e){
Log.e("WEI","Error : " + e.toString());
}
}
});
}
}
在Android上使用能夠BeanShell是有限制的,不是所有的指令碼語言都能正常工作,例如那些對JIT有獨特格式的指令碼,此外不是所有的Java API都在Dalvik中有效。沒有JIT的腳步將比編譯為Dalvik應用慢,慢回事使用者體驗獃滯,並消耗更多的電池能量,因此除非很簡單,一般般在BeanShell中建立整個Android應用。BeanShell指令碼可以處理Android底層安全模式啟動並執行所有事情,例如如果應用設定了READ_CONTACTS許可權,那麼應用中任何的BeanShell指令碼就有相同的許可權。另外,BeanShell最小的Core包也有140K,和應用處理的事情來講,體積太大,消耗儲存太多,下載時間更長。
相關連結:我的Andriod開發相關文章