A1.android一个项目应用另外一个项目和jar包引用
1.被引用的项目在“Android”选项里设置“Is Library”打钩
2.引用项在“Android”选项里设置“add"被引用项
3.android Dependencies会显示引用项目,依赖项目Android Private Libraries:表示放在libs里面的jar包引用,视为私有引用
Referenced Libraries:表示引用的外部jar包。
4.注意:
如果引用项目和被引用项目用到同一个jar包,版本需要保持一致。
Android Private Libraries和Referenced Libraries不能重复引用同一个jar包,两个都有时去掉一个。
A2.Android引用外部包,程序报java.lang.NoClassDefFoundError异常崩溃
在Android工程中,引用第三方jar包(尤其是经过本地编译的),在Java代码开发环境中正常编译输出,但到手机等设备上运行时一旦运行到引用该包的代码,立即异常崩溃,系统显示进程意外停止提示窗口, LogCat 报出异常信息
dalvikvm Could not find class '引用包.类', referenced from method...
AndroidRuntime java.lang.NoClassDefFoundError: 引用包.类
打开 Console 控制台窗口,Android监控页中显示异常信息
trouble processing:
[2014-06-20 14:58:23 - DriverAssistant_Web] Dx bad class file magic (cafebabe) or version (0033.0000)
...while parsing 引用包/类.class
...while processing 引用包/类.class
[2014-06-20 14:58:23 - DriverAssistant_Web] Dx 1 warning
[2014-06-20 14:58:23 - DriverAssistant_Web] Dx
出现这种错误的原因是,当前Android工程(API17 android4.2.2 ADT v21.1)默认使用的是jdk 1.6(JDK 6.0)编译器,而引用的包编译环境大于1.6(如1.7等),由于编译出的字节码版本不一致,导致无法转换成android虚拟机dalvikvm可读的字节码,因此引用的这个类包实际上并没有被编译到这次输出的apk中,自然程序运行的时候就找不到对应的类文件了。
解决方法:
获取引入包的源代码工程,右击工程菜单: Properties(属性)->Java Compiler 窗口中可以选择工程编译使用的jdk版本,选择1.6或1.5,点击确定,重新编译输出jar包,导入Android工程即可:
PS. 1.Android工程本身是不支持更改jdk编译版本的,如果尝试更改至1.7的话,Console控制台将得到错误输出信息 Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.
2. 此时可以将android build tools升级为,编译提示的1.7或以上版本就可以解决该问题!
3. 同时,如果Android项目的jdk compliance设置为jdk1.6,而引入的jar包如果是1.7的,可以将该Andorid项目的complier compliance levels设置为1.7 ,将generated .class files compatibility设置为1.7(因为引入的jar包为1.7) ,将source compatiblity设置为1.6(因为源码的语言规范为1.6不能变)即可!
B1.android编译过程
android编译过程:
先来看张图吧,了解一下android project的编译过程
图里没什么重点,最重要的就是java class file 会通过dx 转换为android 自己设计的dex文件. 这个是快速编译和调试的基础.
编译过程总是先得到class文件,然后转换成dex,最后再做签名对齐等操作.可以看到class才是实质,其它的都是点缀而已,如果我们修改了*.java代码,最先变动的是class文件.
打个比方,我改动了PackageManagerService.java.那么首先是根据我修改的java代码生成新的PackageManagerService.class,然后才是转换为dex格式的services.jar包.
如果我们要修改service.jar里的PackageManagerService,只要得到PackageManagerService.java修改后对应的class文件即可.是不是很简单.有了这个class文件,
之后的转dex格式,签名什么的就易如反掌了.搞过java的都知道,class是java代码的目标文件,里面存放的是java byte code.直接在虚拟机里的可执行代码.
B2.Android基础之用Eclipse搭建Android开发环境
http://www.cnblogs.com/allenzheng/archive/2012/11/10/2762379.html
C1.private Libraries与android Dependency区别
1.android Dependency里面存放的是直接支持的类库,比如导入的第三方支持的源码生成的jar包,而private Libraries里面存放的是android私有的库(libs目录下的)还有第三方支持库中的lib(如meitaio\libs中的jar包,而且这些包有的要打包到APK中)
2.刚刚做了实验,这个是跟引用lib项目有关的.一般Private libs是本项目用的,不用导出到引用项目中去(但是当本项目被作为is libry所引用的时候,本项目的private lib也会被引用,但是不被导出?),具体设置是在order and export中设置.但是private libs应该是跟libs dependency一样
3.添加jar包到libs里面,系统自动把jar加载到android private libraries中;
4.为什么我在eclipse中放入libs之后,是在Android Private Libraries中,而非 dependencies?
热心网友
这是第三方jar包,dependencies是引用的libraries
追问:
大神,怎么才可以jar 包添加到Dependencies 里去呢?
上面是别人的例子,添加到dependencies里。
我也需要添加到
追答:
不需要添加啊。那是第三方的library,不是jar包吧
追问:
library 添加到别的项目里去,不需要添加吗?
追答:
我说的是android library,是在右键项目--properties--android---add中添加的那种
5.Private Libraries 就是libs里面的jar包的映射!你把libs中的jar包移除 Private Libraries中也就没有了
6.java项目使用eclipse导出jar放入android项目的libs里为何不编译?
首先java项目是没有问题的,导出的jar在其它的java项目中也可以正常使用。
编写java和android项目的过程中eclipse也没有给出警告,编译和打包都通过。唯独在(虚拟机和真机)运行调试的时候出现错误:
回答:
狂男风,兼听则明偏信则暗,虚怀若谷上善若水。
harichen 赞同
因为google android使用的并不是oracle制定的java标准,而是一个第三方实现的java标准分支,所以编译上是有细小的差别的,而随着android和java的各自更新升级,这种分歧也越来越大。使用jdk而非adk编译的class对android来说有可能并不是正确有效的目标平台编译文件。
所以这个问题解决起来也非常容易:
1.使用较早期版本的jdk,可以尝试java6甚至java5。然后使用这个老版的jdk编译打包java项目为jar。然后这个jar就可以被用作android项目的第三方jar引用了。
2.如果换早期版本的jdk没有解决问题,或者不想安装老版的jdk,那么你可以尝试从android项目导出jar而非从java项目导出jar。具体实施步骤是:建立一个新的android项目,将java项目的代码文件导入,然后使用android项目菜单导出为jar,然后这样的jar就可以被放在别的android项目里正确引用了。
7.Android项目 libs、private libs、dependencies libs引用防止冲突;所选择的jar导入到APK总结:
a. libs中的jar,如果想最终打包到APK中,要在source中加入libs的目录,这样libs中的jar包就会打入APK中,
b. 如果不想将第三方jar放入libs,可以在libraries条目中使用Add jar引入第三方的jar(一般推荐放入libs中)
c. 要确保libraries条目中所引用的jar包不能冲突
d. 在order and Export条目中,不能重复将jar包打入到APK中,现在android将导出的jar包分为Android Dependencies和Android Private libraries两种,目的是供开发者选择,但是一般这两个都要打入Apk中!
e. order and Export条目中的 libs、src、gen文件夹是肯定会被打包到APK中
D1.JDK,JRE,JVM区别与联系(ZZ):http://www.cnblogs.com/hencehong/p/3252166.html
我们开发的实际情况是:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。
D2.Android开发搭环境步骤, ADT, JDK, SDK, NDK, Eclipse, CDT
http://blog.csdn.net/smking/article/details/7594019