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包
- Android打包Jar 之 二
- Java之jar打包
- Java之jar打包
- android打包jar包
- android studio 打包jar
- Android Studio 打包Jar
- Android手动打包jar
- android studio打包jar
- Android Studio 打包Jar
- Android studio 打包Jar
- android 打包jar包
- android studio 打包 jar
- Android打包jar,aar
- Android Studio 打包Jar
- android studio 打包jar
- Android打jar包之将Android工程连同第三方jar包一起打包成jar包问题总结
- hadoop之MapReduce打包jar
- android 打包自定义JAR包
- 庖丁解牛TLD(二)——初始化工作(为算法的准备)
- SqlServer 分页 ROW_NUMBER() OVER(Order by * DESC ) AS RowNumber
- Ubuntu 14.04 卸载搜狗输入法后无法进入图形界面问题解决办法
- 20150303 N1
- UVa 333 - Recognizing Good ISBNs
- Android打包Jar 之 二
- 上海书桃装饰设计有限公司
- CentOS 架设vsftpd文件传输服务器
- 庖丁解牛TLD(三)——算法初始化
- TOJ3124 Build Your Home--任意多边形面积
- proteus电解电容正负极判断
- 如何适配Arm64架构的 iosAPP
- Android开发记录20-获取缓存大小和清除缓存功能
- No package identifier when getting value for resource