android 打包自定义JAR包

来源:互联网 发布:淘宝618活动 编辑:程序博客网 时间:2024/06/02 22:39
android 打包自定义JAR包

在项目开发过程中,我们难免会用到自己去制作自定义的VIEW控件,之后我们别的项目如果需要的话就直接将其复制到对应的项目中使用,虽说这么做是一个解决问题的方法,但毕竟不是很好。

原因是,当我们项目积累越来越多,会发现自定义的控件越来越多,而且这些自定义的控件都是可以重复利用的,这时我们可以想想,如果把这些自定义控件都封装成一个JAR包,然后用一个项目积累起来,之后我们以后开发项目只要在原来JAR包的基础上做扩展或者直接使用,可以大大减少自己的工作重复性。

 

首先Android 工程的基本面貌是这样的:

 

 

当然对应的Activity 文件被我删除了,因为当编译成jar 包我们并不需要Activity 文件。

 

以上面这个工程为例,我们将它打包成JAR包步骤为:

 

右键工程选择导出:

选择导出目标为:java->JAR文件:

 

 

  

把一些不必要的文件勾选掉,如下图:

 

到了这一步,己经基本完成,浏览选择jar 文件导出路径即可。


导出完成后,我们就可以像使用其他JAR文件一样使用我们自己的自定义控件包了。下面给出一个小DEMO介绍如何使用这个JAR包。

 

步骤一:

 

新建文件夹lib,将jar 包放入。

 

步骤二:

 

关联JAR包,如下图:

步骤三,使用JAR包:

 

如下代码:

 

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:gif="http://schemas.android.com/apk/res/com.terry.jarTest"    android:id="@+id/layout" android:orientation="vertical"    android:layout_width="fill_parent" android:layout_height="fill_parent">    <Button android:text="停止" android:id="@+id/Button01"        android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>    <Button android:text="开始" android:id="@+id/Button02"        android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>     <com.terry.gif.TypegifView        android:layout_width="fill_parent" android:id="@+id/gifView1"        gif:stop="true" android:layout_height="wrap_content"        gif:delay="1"></com.terry.gif.TypegifView> </LinearLayout>

 有一个不好的就是如果你项目中存在使用属性,必须也把属性一起复制到你要使用的项目中,要不然会识别不了。

来自于: http://www.2cto.com/kf/201108/98783.html


 

Android打包成jar的注意事项

一.  如果jar引用到了so库,不能将so库一同打包到jar中,而是要按照下面的方法来做:

      1) 首先,将代码打包成jar, 但是一定是只包括src目录,其它的如lib等都不要选中,也就是说,要用到的so库也不要选中;

      2)   其次,将jar包引入到新的工程中;

      3) 最后, 将用到的so库copy到新工程的libs\armeabi目录下,这样,新工程就能够正确引用jar包了。


 否则,可能出现的问题有:

    Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/

           Caused by: java.lang.UnsatisfiedLinkError: Couldn't load mylib-jni: findLibrary returned null


二.   Android中jar包封装及调用(来自于http://www.eoeandroid.com/forum.php?mod=viewthread&tid=164411&page=1#pid1379740):
        在android开发过程中,我们经常会有这种需求,自己开发一个类库jar包,提供给别人调用。 即把项目A封装成jar包,供项目B调用,而在项目B中调用项目A的activity的时候问题就出现了:找不到资源文件(异常:ERROR/AndroidRuntime(3341):Caused by: android.content.res.Resources$NotFoundException: Stringresource ID #0x7f060007)。问题是,只能共享src文件夹下的代码,而不能共享res资源文件,够郁闷!创建一个Androidproject, 用eclipse的export导出,去掉AndroidManifest.xml,res 什么的,这样只共享了代码,而此代码中所调用的res资源文件却不能正常使用,否则会抛出res.Resources$NotFoundException异常。那么如何解决呢?        
        1.如果只用共享代码,而共享的代码中不涉及到res资源文件的调用的话,直接在Eclipse中导出jar包,在所需要的项目中引用即可。      

  
        2.如果共享代码,而且共享的代码中涉及到res资源文件的调用,网上通用的方法是把res资源文件放到assets文件夹中,再在src代码中加载处理,然后再用eclipse导出jar包,引用即可(res资源虽然可以打进jar包,但当其他项目调用jar包时jar包中引用ID 指向的是当前项目的资源,关于如何让jar包中的资源引用只想jar包中的res文件暂无解决方案。我的问题已解决,解决方案:把图片资源放入assets包中一并打入jar包,布局就只能用代码了。jar包中代码可以成功引用jar包内的assets文件。
另:JNI层不可被打包入jar包,只能同jar包一同提供给第三方并放入工程目录下的libs包中)。    

    
        3.如果共享代码,而且涉及到res资源文件的调用,而且不想把res资源文件放到assets文件夹中的,直接生成jar包会出现的问题:
                首先,当在别的项目中引用此jar包时,在项目名上出现小红叉,并且在console控制台上直接自动提示:Errorgenerating final archive: Found duplicate file for APK:res/drawable-hdpi/icon.png,通常的解决方法时,在能编译通过的此项目中直接去掉提示的资源文件,再生成jar包。


                其次,把公共的icon等资源文件删除,生成jar包之后,此时在项目中引用,console控制台上无自动报错现象。如果jar包中的activity调用了res资源文件夹中的文件,在当前项目中调用jar包中的acticity时,问题就出现了,activity所引用的res资源,如果引用的是Strings.xml文件中的值,则抛出异常ERROR/AndroidRuntime(3341):Caused by: android.content.res.Resources$NotFoundException:Stringresource ID#0x7f060007。如果引用的是layout文件夹中的文件,能找到layout中的xml,例如layout中ee.xml,可以找到R.layout.ee,但是在ee.xml中定义的控件id却引用不到,抛出异常
ERROR/AndroidRuntime(13703):Caused by:java.lang.NullPointerException。如果在当前项目中调用不涉及jar包中的res的调用,一切OK。        

        4.如果共享代码,而且共享的代码中涉及到res资源文件的调用,如果封装成jar包,这种方法是达不到要求的(调用jar中封装的activity,还得保证jar包中activity正常调用jar中所封装的res资源,上面说了,jar包中的res资源部分调用为空),那么如何能满足需求呢?把要生成jar包的项目做一下处理,在jar包项目的properties窗口中选择android的选项卡的isLibaray,点击apply按钮或者ok按钮(此时,jar包项目再点击右键选择runas →  AndroidApplication就能正常运行了)。在要引用jar包的项目中,右击项目名称,打开properties框口,选择android的选项卡的isLibaray右侧的Add按钮,添加jar包项目。这样jar包项目中的activity就能正常引用到jar包项目中的res资源了。项目调用jar包项目的activity就正常了。


0 0