Android打包Jar 之 二

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包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值