Android打包Jar 之 二

来源:互联网 发布:java防止js注入代码 编辑:程序博客网 时间:2024/05/02 02:02

Android打包 Jar
项目开发中难免会将一个大的项目分成几个模块,然后由不同人员分别开发不同模块。最后将每个人做好的完整模块,本别打包成Jar,整合到一个总的项目中。

由于每个模块都是完整的项目,所以每个模块中都会包含一个或者多个Activity,以及一些资源文件,第三方jar包,os包等。
这样再次打包成jar按照上一篇日志那样做,最后很定是会报各种各样的错。
比如:Activity引用了布局文件,如R.layout.XXX或者R.string.XXX,我们使用的时候会报资源ID未找到的异常

下面将使用上一篇中的BB项目,将BB项目打包成Jar项目,BB包中有Activity,布局文件,并且BB项目使用了第三方jar包 (testJar.jar),算是一个典型的例子了。

BB项目中要修改一些代码。
由于BB项目中用的了布局文件,使用了R.layout.XXX,R.id.xxx这样的方法,
这样再打包成Jar后会导致找不到 ID 的错误。

下面在BB项目中创建一个 类 MyResources 。

//该方法是从其他高手那里盗取的哈哈:原文网址http://blog.csdn.net/hhhccckkk/article/details/9313999

一、
//该类的作用就是根据资源的名字获取其 ID 值
代码如下

package com.example.bb;import android.content.Context;public class MyResources {    public static int GetIdByName(Context context, String className, String name) {        String packageName = context.getPackageName();        Class<?> r = null;        int id = 0;        try {              r = Class.forName(packageName + ".R");              @SuppressWarnings("rawtypes")            Class[] classes = r.getClasses();              @SuppressWarnings("rawtypes")            Class desireClass = null;              for (int i = 0; i < classes.length; ++i) {                  if (classes[i].getName().split("\\$")[1].equals(className)) {                      desireClass = classes[i];                      break;                  }              }              if (desireClass != null)                  id = desireClass.getField(name).getInt(desireClass);          } catch (ClassNotFoundException e) {              e.printStackTrace();          } catch (IllegalArgumentException e) {              e.printStackTrace();          } catch (SecurityException e) {              e.printStackTrace();          } catch (IllegalAccessException e) {              e.printStackTrace();          } catch (NoSuchFieldException e) {              e.printStackTrace();          }        return id;    }}

二、
然后修改BBMainActivity.java

package com.example.bb;import com.example.aa.*;import android.support.v7.app.ActionBarActivity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.os.Bundle;public class BBMainActivity extends ActionBarActivity {    private MyTest myTest;    private TextView textView;    private Button btnAdd;    private Button btnSub;    private int number = 10;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //setContentView(R.layout.bbmain);        //将 R.layout.bbmain方法换成如下使用        setContentView(MyResources.GetIdByName(getApplication(), "layout", "bbmain"));        myTest = MyTest.GetInstanse();        //textView = (TextView)this.findViewById(R.id.text);        //将R.id.text 方法换成如下使用        textView = (TextView)this.findViewById(MyResources.GetIdByName(getApplication(), "id", "text"));        //btnAdd = (Button)this.findViewById(R.id.btn);        //将 R.id.btn 换成如下使用        btnAdd = (Button)this.findViewById(MyResources.GetIdByName(getApplication(), "id", "btn"));        btnAdd.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                // TODO Auto-generated method stub                number = myTest.Add(number, number);                SetText(textView, number);            }        });        //btnSub = (Button)this.findViewById(R.id.btn2);        //将R.id.btn2换成如下使用        btnSub = (Button)this.findViewById(MyResources.GetIdByName(getApplication(), "id", "btn2"));        btnSub.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                // TODO Auto-generated method stub                number = myTest.Sub(number, (int)(number * 0.3));                SetText(textView, number);            }        });    }    private void SetText(TextView t, int num)    {        t.setText("number : " + num);    }}

三、修改完成后,将BB项目打包
这里写图片描述

这里写图片描述

这里写图片描述

导出成功
这里写图片描述

四、将导出的testJarBB.jar导入到一个新项目CC中,在新项目中使用它

这里写图片描述

在项目中配置testJarBB.jar

这里写图片描述

这里写图片描述

这里写图片描述

五、到这里还不能直接使用BB项目导出的 testJarBB.jar,因为BB项目中有自己的Activity,布局文件,以及引用外部包“testJar.jar”,接下来我要将BB项目中的布局文件“bbmain.xml”、“testJar.jar”分别拖拽到CC项目中的“res/layout” 文件夹和”libs”文件夹中

如下所示
这里写图片描述

配置其他参数

这里写图片描述

配置 Manifest.xml,将BB项目中的Activity配置到CC项目的 Manifest.xml 中
如下
这里写图片描述

六、为CC项目的主Activity创建布局文件

这里写图片描述

在布局文件中创建一个Button

这里写图片描述

七、准备就绪。在CC项目中引用testJarBB.jar

package com.example.cc;//引入包名import com.example.bb.*;import android.support.v7.app.ActionBarActivity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.content.Intent;import android.os.Bundle;public class MainActivity extends ActionBarActivity {    private Button ccbtn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.ccmain);        //获取Button控件        ccbtn = (Button)this.findViewById(R.id.ccbtn);        //给ccbtn添加一个点击监听事件,当点击ccbtn按钮时        //跳转到项目BB中的Activity        ccbtn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                // TODO Auto-generated method stub                //实例化一个 Intent                 Intent intent = new Intent();                //给意图设置参数,参数1 getApplication(),                //参数2包中的Activity。                    //("com.example.bb.BBMainActivity"该Activity需要在 Manifest.xml配置)                intent.setClassName(getApplication(), "com.example.bb.BBMainActivity");                //启动意图                startActivity(intent);            }        });    }}

运行项目
这里写图片描述

点击ccbtn,跳转到包项目中的Activity

这里写图片描述

点击add、sub按钮运行正常

这里写图片描述

到此已经将完整项目BB打包成功,并且在新项目CC中成功调用BB项目导出的Jar包

0 0
原创粉丝点击