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包的路径

private String jarPath;

   // jar解压路径,jar包中的dex文件会被解压缩

   private String 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) {

              // TODO Auto-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) {

           // TODO Auto-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) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

 

        }

      });

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


效果图

 

 

http://wenku.baidu.com/link?url=a_7Mz0z7EWH3JkCkqc4rFpivzkDsFVIyr-smsDqyoeAAJq4x_w4QOllzNoJp4OxjEnSmCVnGA-NAfkMdu1lWK6ahc7nI-RU3nlTOfATk58u

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将外部Jar包引入到Spring Boot项目并打包到Jar包,可以按照以下步骤进行操作: 1. 在pom.xml文件添加依赖项。例如,要引入一个名为example.jar外部Jar包,可以通过以下方式添加依赖项: ``` <dependency> <groupId>com.example</groupId> <artifactId>example</artifactId> <version>1.0.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/example.jar</systemPath> </dependency> ``` 其,systemPath指定了外部Jar包的路径,scope设置为system,表示使用系统路径下的Jar包。 2. 将外部Jar包复制到项目的lib目录下,例如,将example.jar复制到项目目录下的lib文件夹。 3. 在pom.xml文件添加Maven插件,以将外部Jar包打包到生成的Jar包。例如,可以添加以下插件: ``` <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.example.Application</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> ``` 其,classpathPrefix指定了Jar包lib文件夹下的依赖项路径前缀,mainClass指定了Spring Boot应用程序的主类。 4. 使用Maven命令进行打包,生成的Jar包将包含外部Jar包。例如,使用以下命令进行打包: ``` mvn clean package ``` 这样,生成的Jar包就包含了外部Jar包,并可以在运行时使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值