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包