android jar 加入图片,Android动态加载外部jar包及jar包中图片等资源文件
Android動態加載外部jar包及jar包中圖片等資源文件
Android應用程序由Java開發,因此Java中許多實用的特性,在Android中也有體現。動態加載Class,也就是外部jar包,在Java中簡單的方法就是在項目的Bulid Path中導入jar,然后就可以使用jar包中的Class文件,這些,都需要java虛擬機的支持。
Android的虛擬機與java虛擬機有區別。所以在動態加載jar包上面有區別。簡單來說就是android的虛擬機不能識別jar包,需要將jar包轉換為可識別的dex文件(android系統可執行文件)。
Android中動態加載jar包的類,使用DexClassLoader來實現。
Jar包中可以打進android項目res文件夾下的資源文件,android中亦可以對jar包中的資源文件進行加載。
Android中加載jar包中的如txt,png等文件,使用JarFile類進行。
2.制作jar包,轉換為dex文件
使用面向接口編程:
2.1寫好功能接口與接口的實現。
2.2將接口打成IDynamic.jar,將接口實現打成Dynamic.jar
?
面向接口編程,調用jar包的項目導入接口的jar包,接口實現的jar包放在項目外部,用于調用。
2.3將功能接口的實現類的jar包轉為dex文件
1)?????將Dynamic.jar復制到adt-bundle-windows-x86-20131030\sdk\build-tools\android-4.4,將jar包轉為android識別的dex文件。
2)?????進入cmd,cd到上面的目錄,執行命令:
dx ?--dex?--output? = Dynamic_temp.jar ?Dynamic.jar
Dynamic_temp.jar是要生成的dex包。
注:jar包中可以將res中的資源打包進去。
3.使用jar包,動態加載。
1.??????將接口實現類的jar包Dynamic_temp.jar導入到模擬器的sd卡上,為了方便,直接導入根目錄下。
2.??????將接口IDynamic.jar導入需要調用的項目中。
3.1動態加載jar包中的Class,例子是在activity中:
//動態加載類的接口
private IDynamic lib = null;
// android可執行class加載器
private DexClassLoader c1;
//動態加載外部(sd卡中)jar包的路徑
privateString jarPath;
// jar解壓路徑,jar包中的dex文件會被解壓縮
privateString jarOutputPath;
jarPath = Environment.getExternalStorageDirectory()
.toString() + File.separator + "dynamic_temp.jar";
jarOutputPath = Environment.getExternalStorageDirectory()
.toString() + File.separator + "ExtendJar";
//定義DexClassLoader
//第一個參數:是dex壓縮文件的路徑
//第二個參數:是dex解壓縮后存放的目錄
//第三個參數:是C/C++依賴的本地庫文件目錄,可以為null
//第四個參數:是上一級的類加載器
c1 = new DexClassLoader(jarPath, jarOutputPath, null, getClassLoader());
try {
Class> dynamic = c1
.loadClass("com.dynamic.interfacesImpl.Dynamic");
lib = (IDynamic) dynamic.newInstance();
if (lib != null) {
lib.init(MainActivity.this);
}
} catch (Exception e) {
e.printStackTrace();
}
在按鈕的點擊事件中調用jar中的方法:
public void onClick(View arg0) {
lib.showToast();
}
3.2動態加載jar包中的資源:圖片、文本等
將jar包中打入資源文件,例子中是res/drawable-mdpi/ic_launcher.png,及jar自帶的META-INF/MANIFEST.MF文件。
3.2.1解析jar包中的文本文件:
Button btn4 = (Button) findViewById(R.id.btn4);
btn4.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
JarFile jarfile;
InputStream is;
try {
jarfile = new JarFile(jarPath);
is = jarfile.getInputStream(jarfile
.getEntry("META-INF/MANIFEST.MF"));
StringBuffer out=new StringBuffer();
byte[] b=new byte[4096];
for (int n; (n = is.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
TextView txt = (TextView) MainActivity.this
.findViewById(R.id.textView);
txt.setText(out.toString());
is.close();
} catch (IOException e) {
//TODOAuto-generated catch block
e.printStackTrace();
}
}
});
將從jar包中讀出的文本文件,以inputStream流的形式讀出,再輸出。
3.2.2 解析jar包中的圖片
將jar包中的圖片以inputStream流的形式讀出,再將inputStream流轉為bmp圖片對象,進行使用。
Button btn3 = (Button) findViewById(R.id.btn3);
btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
//TODOAuto-generated method stub
JarFile jarfile;
InputStream is;
try {
jarfile = new JarFile(jarPath);
is = jarfile.getInputStream(jarfile
.getEntry("res/drawable-mdpi/ic_launcher.png"));
/*
*將inputStream流轉為bmp對象
*/
Bitmap bmp = BitmapFactory.decodeStream(is);
ImageView img = (ImageView) MainActivity.this
.findViewById(R.id.img);
img.setImageBitmap(bmp);
is.close();
} catch (IOException e) {
//TODOAuto-generated catch block
e.printStackTrace();
}
}
});
效果圖
http://wenku.baidu.com/link?url=a_7Mz0z7EWH3JkCkqc4rFpivzkDsFVIyr-smsDqyoeAAJq4x_w4QOllzNoJp4OxjEnSmCVnGA-NAfkMdu1lWK6ahc7nI-RU3nlTOfATk58u
總結
以上是生活随笔為你收集整理的android jar 加入图片,Android动态加载外部jar包及jar包中图片等资源文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xamarin android pdf,
- 下一篇: Android蓝牙无法通信,androi