如何制作Jar包并在android中调用jar包
android制作jar包:
新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmanifest.xml和res文件夹,就可以了。否则在调用jar包的时候会出现“Error generating final archive: Found duplicate file for APK: AndroidManifes”这个错误。
如果在android用调用jar包,需要在工程的属性的Java build path中点击Add external JARS(也可以选择Add Library)添加jar包,在程序中调用调用jar包中的函数即可。
添加jar包:(jar在windows下编译了就可用了,不需要交叉编译,这也体现了java一次编译跨平台的特点)
也可以在Java build path中点击Add Library添加jar包(可参考Android中引入第三方Jar包的方法,测试可行(http://www.havenliu.com/android/548.html))
在程序中调用jar包中的方法 (本文中 小写的hello是包名,大写的Hello类名,test是方法):
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
制作可执行的的jar包需要添加MANIFEST.MF。不需要执行的jar包,不需要MANIFEST.MF,只需要把用的class文件打包就可以了。 (jar cvf a.jar hello.class hello2.class)
制作可执行的的jar包,注意MANIFEST.MF ,M(必须大写)ain-C(必须大写)lass:(必须有个空格)包名.类名(必须回车),必须回车,
否则运行jar包(java -jar a.jar)时候会出现" Fail to load main-class manifest attribute from a.jar" 这个错误。
其他文档:
jar包中资源问题总结(http://blog.csdn.net/yy4040/article/details/6641688)
之前提出来一个问题,参见
http://topic.csdn.net/u/20110630/14/ad71749c-631b-4fef-950d-92d5d6983628.html
分析结果如下:
1、jar被包含进其他项目后,最终生成的apk文件中包含jar中的资源(目录结构也是一样的),这个可以通过zip打开jar和apk查看。
2、jar中的资源应该也是被jvm管理起来的,但是由于其实际id与原始jar项目中产生的id不一致,导致使用原始jar项目中的资源id不能访问到实际资源。只能通过getClass().getClassLoader().getResourceAsStream()的方式进行访问。
对于使用jar方式进行组件开发,有以下需要注意:
1. jar包中一般只包含代码不包含资源。
2. 如果要在jar中包含资源,则资源文件不应该放在默认的res目录下(因为导入其他项目后可能出现重名冲突),应该在package目录下创建专用的资源目录,如此通过pakcage的不重名来确保导入后资源不冲突。同时,jar中代码不能直接使用R类中资源id进行访问,应该通过getClass().getClassLoader().getResourceAsStream()进行加载。
3. 字付串资源可以定义成常量的方式来使用。
Android下编译自己的库文件jar并在应用中调用
主要为了解决如下问题:
项目中使用了Android未公开的API,在Eclipse下会有红叉显示。
不同的项目抽出相同部分的代码共用。
必需的前提条件:
需要有Android源代码,编译的库文件主要是封装未公开API或者共用代码。
工程1:Java库文件工程
该工程最终会生成以jar结尾的Java库文件,并会被安装到设备的以下目录:
/system/framework/
另外还会安装相关库文件的说明文件,使系统能够找到库文件:
/system/etc/permissions/
1、建立工程
在Eclipse下新建一个空的Java工程。
在工程的
Java Build Path -> Libraries
下,导入Android的SDK中的 android.jar 库。
为工程创建相应的包和java文件。
下面假设包路径为 com.mytest.lib,最终生成的库为 mylib.jar。
2、为工程添加注册文件
在库文件工程的根目录下创建以下文件:
<permission xml file name>.xml
该文件是用来向系统注册库用的,名称可以自己定,在下面假设该文件为 mylibxml.xml。
在文件中加入以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<permissions>
<library
name="com.mytest.lib"
file="/system/framework/mylib.jar"
/>
</permissions>
其中的 library 用于将其下的 name 和 file 两个属性关联起来,name 的值后边会用到。
这里的 name 指定为工程的包名。
这里的 file 指定为库文件的存放路径,应该是:
/system/framework/<jar file name>.jar
3、为工程添加makefile文件:
在库文件工程的根目录下创建以下文件:
Android.mk
该文件是用来编译工程的,名称固定。
在文件中加入以下内容:
LOCAL_PATH:= $(call my-dir)
#MAKE_JAR
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := mylib
include $(BUILD_JAVA_LIBRARY)
#MAKE_XML
include $(CLEAR_VARS)
LOCAL_MODULE := mylibxml.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
其中,MAKE_JAR 部分的 LOCAL_MODULE 部分指定为想要生成的库文件的名字,
需要与 .xml 文件中的 library 下的 file 部分一致。
其中,MAKE_XML 部分的 LOCAL_MODULE 部分指定为用于注册库的 .xml 文件。
4、生成应用程序可用的库文件
此时的工程,如果使用了未公开的API的话,在eclipse下应该是有红叉的。
这些错误不用管,只需要保证程序在Android的源码下能够编译通过即可。
将工程的java文件以及 .xml 和 .mk 按照目录结构拷贝到以下目录:
<Android source folder>/packages/apps/<project name>/
运行以下命令:
$ cd <Android source folder>
$ . ./build/envsetup.sh
$ mmm packages/apps/<project name>
将会生成一个 .jar 文件和一个 .xml 文件。
以上两个文件是应用程序在运行时需要用到的。
调试应用前,需要将两个文件拷贝到设备的相应目录上去:
.jar 文件:/system/framework/
.xml 文件:/system/etc/permissions/
拷贝到设备使用以下命令:
$ sudo adb push <.jar or .xml file path> <path in device>
拷贝完以后需要重启设备。
5、生成在Eclipse可以引用的库文件
在源码下编译的 .jar 文件在Eclipse中是不能使用的,需要单独生成。
在Eclipse下选中工程根目录,选择文件菜单中的导出Export,然后选择jar类型。
导出为jar文件时,只需要选中相应的java文件即可。
这样生成的jar文件仅仅供应用程序在Eclipse下使用,除非是以下情况:
库文件没有使用非公开的API,并且,
应用本身在Eclipse下编译就能够使用,不需要到源码下编译。
暂且为该文件命名为mylibtemp.jar
工程2:Android应用工程
1、建立工程
新建一个Android工程。
在工程的
Java Build Path -> Libraries
下,导入 mylibtemp.jar 库。
使用 mylibtemp.jar 中的类编写代码。
下面假设最后生成的应用程序文件为 myapp.apk。
2、编辑AndroidManifest.xml文件
编辑工程根目录下的 AndroidManifest.xml 文件。
在 application 下添加以下内容:
<uses-library
android:name="com.mytest.lib">
</uses-library>
其中的 :name 表示所引用的库文件的包名。
其与库工程的 .xml 文件中的 name 应该是一致的。
这样在应用运行时就能够找到相应的 .jar 文件了。
如果引用了多个库,需要添加多个 uses-library 标签。
3、为工程添加makefile文件:
在库文件工程的根目录下创建以下文件:
Android.mk
该文件是用来编译工程的,名称固定。
在文件中加入以下内容:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := mylib
LOCAL_PACKAGE_NAME := myapp
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
其中的 LOCAL_JAVA_LIBRARIES 表示程序会用到的库文件。
其名成与库工程下的 .mk 文件中 MAKE_JAR 部分下的 LOCAL_MODULE 应该是一致的。
其中的 LOCAL_PACKAGE_NAME 表示应用最后生成的名称。
4、编译应用程序
将工程的 src、res、assets 文件夹以及文件:
Android.mk 和 AndroidManifest.xml
按照目录结构拷贝到以下目录:
<Android source folder>/packages/apps/<project name>/
引用的 .jar 库文件并不需要。
运行以下命令:
$ cd <Android source folder>
$ . ./build/envsetup.sh
$ mmm packages/apps/<project name>
将会生成一个 .apk 文件。
运行以下命令将应用安装到设备:
$ sudo adb install [-r] <apk file path>
以下为制作可执行jar包方法:
转自:http://blog.chinaunix.net/uid-20640731-id-60041.html
public class Hello {
public static void main(String args[]){
System.out.println("Hello World!");
}
}
标明清单(manifest)
增加:hello/(读入= 0) (写出= 0)(存储了 0%)
增加:hello/Hello.class(读入= 422) (写出= 289)(压缩了 31%)
增加:hello/Hello.java(读入= 136) (写出= 108)(压缩了 20%)
Hello World!
按照下文http://blog.chinaunix.net/uid-20640731-id-60041.html测试了,成功。
制作可执行的的jar包需要添加MANIFEST.MF。不需要执行的jar包,不需要MANIFEST.MF,只需要把用的class文件打包就可以了。 (jar cvf a.jar hello.class hello2.class)
制作可执行的的jar包,注意MANIFEST.MF ,M(必须大写)ain-C(必须大写)lass:(必须有个空格)包名.类名(必须回车),必须回车,
否则运行jar包(java -jar a.jar)时候会出现" Fail to load main-class manifest attribute from a.jar" 这个错误。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
制作可执行的的jar包需要添加MANIFEST.MF。不需要执行的jar包,不需要MANIFEST.MF,只需要把用的class文件打包就可以了。 (jar cvf a.jar hello.class hello2.class)
制作可执行的的jar包,注意MANIFEST.MF ,M(必须大写)ain-C(必须大写)lass:(必须有个空格)包名.类名(必须回车),必须回车,
否则运行jar包(java -jar a.jar)时候会出现" Fail to load main-class manifest attribute from a.jar" 这个错误。
如何制作Jar包并在android中调用jar包的更多相关文章
- Android中常见功能包描述(转)
在Android中,各种包写成android.*的方式,重要包的描述如下所示:android.app :提供高层的程序模型.提供基本的运行环境android.content:包含各种的对设备上的数据进 ...
- Android中常见功能包描述
在Android中,各种包写成android.*的方式,重要包的描述如下所示:android.app :提供高层的程序模型.提供基本的运行环境android.content:包含各种的对设备上的数据进 ...
- 在Android中调用C#写的WebService(附源代码)
由于项目中要使用Android调用C#写的WebService,于是便有了这篇文章.在学习的过程中,发现在C#中直接调用WebService方便得多,直接添加一个引用,便可以直接使用将WebServi ...
- 在Eclipse中调用weka包实现分类
1.如题. 最近写了一个FCM的聚类算法,希望能够可视化结果,因此一个想法是调用weka中的包,使自己的程序可以可视化.这里参考了网络上的方法,首先实现在Eclipse中调用weka包实现分类的功能. ...
- Android中调用系统所装的软件打开文件(转)
Android中调用系统所装的软件打开文件(转) 在应用中如何调用系统所装的软件打开一个文件,这是我们经常碰到的问题,下面是我所用到的一种方法,和大家一起分享一下! 这个是打开文件的一个方法: /** ...
- 在Android中调用WebService
某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查.我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数 ...
- 【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在And ...
- Android中调用C++函数的一个简单Demo
这里我不想多解释什么,对于什么JNI和NDK的相关内容大家自己去百度或谷歌.我对Android的学习也只是个新手.废话少说直接进入正题. 一.在Eclipse中创建一个Android Applicat ...
- Java乔晓松-android中调用系统拍照功能并显示拍照的图片
android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...
随机推荐
- jsoupa-解析遍历一个HTML
解析个遍历一个HTML文档 String html ="<html><head><title>First parse</title></ ...
- Eclipse js报错问题解决办法
最近在Eclipse中导入新项目后会发现js报错,但是不影响程序的运行,但是对于程序员的我们来说多少还是比较在意代码前面的红色的X的,有木有??? 上网也查了很多方法,对于其中一种方法表示不能完全解决 ...
- php and mysql 常用api函数
- Bugzilla使用规范
登陆Bugzilla Bugzilla登陆地址: http://172.21.8.39:21500/manual/ 账号:XXX@sim.com 密码:123456 Bugzilla简介 Bugzil ...
- HAWQ + MADlib 玩转数据挖掘之(七)——关联规则方法之Apriori算法
一.关联规则简介 关联规则挖掘的目标是发现数据项集之间的关联关系,是数据挖据中一个重要的课题.关联规则最初是针对购物篮分析(Market Basket Analysis)问题提出的.假设超市经理想更多 ...
- NBUT 1222 English Game 2010辽宁省赛
Time limit 1000 ms Memory limit 131072 kB This English game is a simple English words connection gam ...
- 常用增强学习实验环境 II (ViZDoom, Roboschool, TensorFlow Agents, ELF, Coach等) (转载)
原文链接:http://blog.csdn.net/jinzhuojun/article/details/78508203 前段时间Nature上发表的升级版Alpha Go - AlphaGo Ze ...
- C++ 泛型 编写的 数据结构 队列
平时编程里经常需要用到数据结构,比如 栈和队列 等, 为了避免每次用到都需要重新编写的麻烦现将 C++ 编写的 数据结构 队列 记录下来,以备后用. 将 数据结构 队列 用头文件的形式写成 ...
- AOP jdk动态代理
一: jdk动态代理是Spring AOP默认的代理方法.要求 被代理类要实现接口,只有接口里的方法才能被代理,主要步骤是先创建接口,接口里创建要被代理的方法,然后定义一个实现类实现该接口,接着将被代 ...
- 《DSP using MATLAB》Problem 4.1
用到的z变换的计算公式: 代码: %% ------------------------------------------------------------------------ %% Outp ...