常见android编译错误解决

jopen 13年前
     <p><strong>1、32位系统下的编译</strong></p>    <p><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;">如果需要在32位系统中编译android系统,在编译前需要对部分makefile进行修改</span></p>    <p><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;">首先修改build/core/main.mk,修改的内容如下所示:</span><br /> </span></p>    <p><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;"> <span style="font-family:monospace;white-space:pre;">-ifneq (64,$(findstring 64,$(build_arch)))</span></span></span></p>    <p><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="font-family:monospace;white-space:pre;">+ifneq (i686,$(findstring i686,$(build_arch)))</span></span></span></p>    <p><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="font-family:monospace;white-space:pre;">$(warning ************************************************************)</span></span></span><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="font-family:monospace;white-space:pre;"> $(warning You are attempting to build on a 32-bit system.)</span></span></span><span style="line-height:20px;font-family:monospace;white-space:pre;color:#555555;"> </span></p>    <p><span style="line-height:20px;font-family:monospace;white-space:pre;color:#555555;">$(warning Only 64-bit build environments are supported beyond froyo/2.2.)</span></p>    <p><span style="line-height:20px;font-family:monospace;white-space:pre;color:#555555;"><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;">其次修改如下四个文件:</span><br /> </span></p>    <p></p>    <pre style="border-bottom:#e6e6e6 1px solid;border-left:#e6e6e6 1px solid;padding-bottom:0px;overflow-x:auto;overflow-y:auto;background-color:#f5f5f5;margin:0px 0px 15px;padding-left:15px;width:593px;padding-right:20px;border-top:#e6e6e6 1px solid;border-right:#e6e6e6 1px solid;padding-top:10px;background-origin:initial;background-clip:initial;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;">external/clearsilver/cgi/Android.mk external/clearsilver/java-jni/Android.mk external/clearsilver/util/Android.mk external/clearsilver/cs/Android.mk</pre>    <pre style="border-bottom:#e6e6e6 1px solid;border-left:#e6e6e6 1px solid;padding-bottom:0px;overflow-x:auto;overflow-y:auto;background-color:#f5f5f5;margin:0px 0px 15px;padding-left:15px;width:593px;padding-right:20px;border-top:#e6e6e6 1px solid;border-right:#e6e6e6 1px solid;padding-top:10px;background-origin:initial;background-clip:initial;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;"> # This forces a 64-bit build for Java6 -LOCAL_CFLAGS += -m64 -LOCAL_LDFLAGS += -m64 +LOCAL_CFLAGS += -m32 +LOCAL_LDFLAGS += -m32</pre>    <pre style="border-bottom:#e6e6e6 1px solid;border-left:#e6e6e6 1px solid;padding-bottom:0px;overflow-x:auto;overflow-y:auto;background-color:#f5f5f5;margin:0px 0px 15px;padding-left:15px;width:593px;padding-right:20px;border-top:#e6e6e6 1px solid;border-right:#e6e6e6 1px solid;padding-top:10px;background-origin:initial;background-clip:initial;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;">即<span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;">将LOCAL_CFLAGS和LOCAL_LDFLAGS由-m64改为-m32,从而指定使用32位系统进行编译</span></pre>    <strong>2 、build/core/base_rules.mk:128:*** frameworks/opt/emoji/jni:</strong>    <br /> .... libgl2jni already defined by framwworks/base/opengl/tests/gl2_jni/jni 停止    <br />    <br /> 从编译规则上看:    <br /> # Make sure that this IS_HOST/CLASS/MODULE combination is unique.    <br /> module_id := MODULE.$(if \    <br />     $(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)    <br /> ifdef $(module_id)    <br /> $(error $(LOCAL_PATH): $(module_id) already defined by $($(module_id)))    <br /> endif    <br />    <br /> 在framwworks/base/opengl/tests/gl2_jni/下面定义的android.mk定义了:    <br /> LOCAL_MODULE := libgl2jni    <br /> include $(BUILD_SHARED_LIBRARY)    <br /> 导致生成的动态库重复,这是不对的,修改tests这个目录不参与编译即可,最直接的办法删除掉framwworks/base/opengl/tests/gl2_jni这个文件夹    <p><span style="font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="line-height:20px;white-space:pre;"><strong>3、AIDL 编译报couldn't find import for class原因</strong><br /> “AIDL服务只支持有限的数据类型,因此,如果用AIDL服 务传递一些复杂的数据就需要做更一步处理。AIDL服务支持的数据类型如下:<br /> Java的简单类 型(int、char、boolean等)。不需要导入(import)。String和 CharSequence。不需要导入(import)。<br /> List和 Map。但要注意,List和Map对象的元素类型必须是AIDL服务支持的数据类型。不需要导入(import)。AIDL自动生成 的接口。需要导入(import)。<br /> 实现 android.os.Parcelable接口的类。需要导入(import)。<br /> 其中后两种数据类 型需要使用import进行导入,传递不需要 import的数据类型的值的方式相同。传递一个需要import的数据类型的值(例如,实现android.os.Parcelable 接口的类)的步 骤略显复杂。除了要建立一个实现android.os.Parcelable接口的类外,还需要为这个类单独建立一个aidl文件,并使用 parcelable关键字进行定义。”<br /> </span></span><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;white-space:pre;color:#555555;">没有加LOCAL_AIDL_INCLUDES += xxx ,所以找不到我的parcelable aidl文件。</span></p>    <p><span style="font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="line-height:20px;white-space:pre;">修改android源码根目录下的build/core/pathmap.mk把你的目录加进去,此时再make update-api</span></span></p>    <p><span style="line-height:20px;font-family:monospace;white-space:pre;color:#555555;"><span style="line-height:20px;font-family:Arial, Tahoma, Verdana;color:#555555;"><strong>4、老是提示 @Override错误 方法未覆盖其父类的方法</strong><br /> 使 用JDK1.6编译没有问题,使用JDK1.5编译,会报@Override方法未覆盖其父类的方法。实际上这个方法是类实现的接口中方法,<br /> 但是,这个语 法的jdk1.6的下面是可以通过的,也就是说jdk1.6认为类覆盖父类方法与实现接口方法都叫override,而jdk1.5不<br /> 是这样认为的,不知 道这是当初jdk1.5的bug,还是当初就是认为覆盖父类方法与实现接口方法是不一样的,不得而知。但是从<br /> OO角度来看,覆盖父类方法与实现接口方法都 可以认为override,因为他们目的都是一样的,都是为了重用,都是多态的一种<br /> 表现方式。</span></span></p>    <p><span style="font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="line-height:20px;white-space:pre;">更改jdk版本为1.6即可</span></span></p>    <p><span style="font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="line-height:20px;white-space:pre;"><strong>5、编译alsa-lib库错误</strong></span></span></p>    <p><span style="font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="line-height:20px;white-space:pre;">android系统开发移植alsa-lib库的过程中编译的时候出现了如下的错误<br /> /tmp/cckyaR40.s: Assembler messages:<br /> /tmp/cckyaR40.s:2763: Error: selected processor does not support `mrs ip,cpsr'<br /> /tmp/cckyaR40.s:2764: Error: unshifted register required -- `orr r2,ip,#128'<br /> /tmp/cckyaR40.s:2765: Error: selected processor does not support `msr cpsr_c,r2<br /> 字面的意思报的是汇编错误,选择的处理器不支持mrs和msr指令。<br /> 原来的ARM指令有32位和16位两种指令模式,16位为thumb指令集,thumb指令集编译出的代码占用空间小,<br /> 而且效率也高,所以android的arm编译器默认用的是thumb模式编译,问题在于alsa的代码中有部分的内容<br /> 用到了32位的指令,所以才会报如下的错误,修改的方法也很简单,在Android.mk中加入如下内容即可:<br /> LOCAL_ARM_MODE := arm<br /> android的编译系统中LOCAL_ARM_MODE变量的取值为arm或者thumb,代表32位和16位两种arm指令集,默认为thumb<br /> prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/../../../../arm-eabi/bin/ld: failed to set dynamic section sizes: Bad value</span></span></p>    <span style="font-family:Arial, Tahoma, Verdana;color:#555555;"><span style="line-height:20px;white-space:pre;">collect2: ld returned 1 exit status<br /> make: *** [out/target/product/merlin/obj/SHARED_LIBRARIES/libasound_intermediates/LINKED/libasound.so] 错误 1<br /> 解决此问题将alsa-lib/include/config.h文件中的如下宏定义去掉即可:<br /> #define VERSIONED_SYMBOLS</span></span>