在Android應用中使用第三方Jar包
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,和應 用處理的事情來講,體積太大,消耗存儲太多,下載時間更長。