新人求教,编译一个最简单的Android程序,提示下面的错误咋解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新人求教,编译一个最简单的Android程序,提示下面的错误咋解决相关的知识,希望对你有一定的参考价值。

1、32位系统下的编译

如果需要在32位系统中编译android系统,在编译前需要对部分makefile进行修改

首先修改build/core/main.mk,修改的内容如下所示:

-ifneq (64,$(findstring 64,$(build_arch)))

+ifneq
(i686,$(findstring i686,$(build_arch)))

$(warning
************************************************************) $(warning You are attempting to build on a 32-bit system.)

$(warning Only 64-bit build environments are supported beyond froyo/2.2.)

其次修改如下四个文件:

external/clearsilver/cgi/Android.mk
external/clearsilver/java-jni/Android.mk
external/clearsilver/util/Android.mk
external/clearsilver/cs/Android.mk # This forces a 64-bit build for Java6
-LOCAL_CFLAGS += -m64
-LOCAL_LDFLAGS += -m64
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32即将LOCAL_CFLAGS和LOCAL_LDFLAGS由-m64改为-m32,从而指定使用32位系统进行编译如果使用 64bit 的操作系统编译,这些就都不用修改,但记得需要安装:For 64-bit servers the following extra packages may be needed:
"sudo apt-get install libc6-dev-i386" (libc6-dev-amd64 if AMD CPU)
"sudo apt-get install g++-multilib lib32ncurses5-dev lib32z1-dev"
还有 jdk64bit 的版本编译2 、build/core/base_rules.mk:128:*** frameworks/opt/emoji/jni:
.... libgl2jni already defined by framwworks/base/opengl/tests/gl2_jni/jni 停止

从编译规则上看:
# Make sure that this IS_HOST/CLASS/MODULE combination is unique.
module_id := MODULE.$(if \\
$(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)
ifdef $(module_id)
$(error $(LOCAL_PATH): $(module_id) already defined by $($(module_id)))
endif

在framwworks/base/opengl/tests/gl2_jni/下面定义的android.mk定义了:
LOCAL_MODULE := libgl2jni
include $(BUILD_SHARED_LIBRARY)
导致生成的动态库重复,这是不对的,修改tests这个目录不参与编译即可,最直接的办法删除掉framwworks/base/opengl/tests/gl2_jni这个文件夹

3、AIDL 编译报couldn\'t find import for class原因
“AIDL服务只支持有限的数据类型,因此,如果用AIDL服 务传递一些复杂的数据就需要做更一步处理。AIDL服务支持的数据类型如下:
Java的简单类 型(int、char、boolean等)。不需要导入(import)。String和 CharSequence。不需要导入(import)。
List和 Map。但要注意,List和Map对象的元素类型必须是AIDL服务支持的数据类型。不需要导入(import)。AIDL自动生成 的接口。需要导入(import)。
实现 android.os.Parcelable接口的类。需要导入(import)。
其中后两种数据类 型需要使用import进行导入,传递不需要 import的数据类型的值的方式相同。传递一个需要import的数据类型的值(例如,实现android.os.Parcelable 接口的类)的步 骤略显复杂。除了要建立一个实现android.os.Parcelable接口的类外,还需要为这个类单独建立一个aidl文件,并使用parcelable关键字进行定义。”
没有加LOCAL_AIDL_INCLUDES += xxx ,所以找不到我的parcelable aidl文件。

修改android源码根目录下的build/core/pathmap.mk把你的目录加进去,此时再make update-api

4、老是提示 @Override错误 方法未覆盖其父类的方法
使 用JDK1.6编译没有问题,使用JDK1.5编译,会报@Override方法未覆盖其父类的方法。实际上这个方法是类实现的接口中方法,
但是,这个语 法的jdk1.6的下面是可以通过的,也就是说jdk1.6认为类覆盖父类方法与实现接口方法都叫override,而jdk1.5不
是这样认为的,不知 道这是当初jdk1.5的bug,还是当初就是认为覆盖父类方法与实现接口方法是不一样的,不得而知。但是从
OO角度来看,覆盖父类方法与实现接口方法都 可以认为override,因为他们目的都是一样的,都是为了重用,都是多态的一种
表现方式。

更改jdk版本为1.6即可

5、编译alsa-lib库错误

android系统开发移植alsa-lib库的过程中编译的时候出现了如下的错误
/tmp/cckyaR40.s: Assembler messages:
/tmp/cckyaR40.s:2763: Error: selected processor does not support `mrs ip,cpsr\'
/tmp/cckyaR40.s:2764: Error: unshifted register required -- `orr r2,ip,#128\'
/tmp/cckyaR40.s:2765: Error: selected processor does not support `msr cpsr_c,r2
字面的意思报的是汇编错误,选择的处理器不支持mrs和msr指令。
原来的ARM指令有32位和16位两种指令模式,16位为thumb指令集,thumb指令集编译出的代码占用空间小,
而且效率也高,所以android的arm编译器默认用的是thumb模式编译,问题在于alsa的代码中有部分的内容
用到了32位的指令,所以才会报如下的错误,修改的方法也很简单,在Android.mk中加入如下内容即可:
LOCAL_ARM_MODE := arm
android的编译系统中LOCAL_ARM_MODE变量的取值为arm或者thumb,代表32位和16位两种arm指令集,默认为thumb
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

collect2: ld returned 1 exit status
make: *** [out/target/product/merlin/obj/SHARED_LIBRARIES/libasound_intermediates/LINKED/libasound.so] 错误 1
解决此问题将alsa-lib/include/config.h文件中的如下宏定义去掉即可:
#define VERSIONED_SYMBOLS

开发过程中碰到过很多错误,后续再一一总结记录下来,有些忘记了。。

在android.mk中编译:

include $(CLEAR_VARS)
$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

出现提示需要定义:LOCAL_MODULE_TAGS := optional 一般修改方法是:

build\\core\\definitions.mk 中的宏定义变量:

define include-prebuilt
include $$(CLEAR_VARS)
LOCAL_SRC_FILES := $(1)
LOCAL_BUILT_MODULE_STEM := $(1)
LOCAL_MODULE_SUFFIX := $$(suffix $(1))
LOCAL_MODULE := $$(basename $(1))
LOCAL_MODULE_CLASS := $(2)
include $$(BUILD_PREBUILT)
endef

在这里增加一个LOCAL_MODULE_TAGS := optional

但是这需要修改android源码,如果不是自已的android系统,这么做就麻烦了,所以必须想其它办法解决:

#include $(CLEAR_VARS)
#$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

include $(CLEAR_VARS)
LOCAL_SRC_FILES := libyfcdca.a
LOCAL_BUILT_MODULE_STEM := libyfcdca.a
LOCAL_MODULE_SUFFIX := lib
LOCAL_MODULE := yfcdca
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)

如此即可了。供你参考
1、32位系统下的编译

如果需要在32位系统中编译android系统,在编译前需要对部分makefile进行修改

首先修改build/core/main.mk,修改的内容如下所示:

-ifneq (64,$(findstring 64,$(build_arch)))

+ifneq
(i686,$(findstring i686,$(build_arch)))

$(warning
************************************************************) $(warning You are attempting to build on a 32-bit system.)

$(warning Only 64-bit build environments are supported beyond froyo/2.2.)

其次修改如下四个文件:

external/clearsilver/cgi/Android.mk
external/clearsilver/java-jni/Android.mk
external/clearsilver/util/Android.mk
external/clearsilver/cs/Android.mk # This forces a 64-bit build for Java6
-LOCAL_CFLAGS += -m64
-LOCAL_LDFLAGS += -m64
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32即将LOCAL_CFLAGS和LOCAL_LDFLAGS由-m64改为-m32,从而指定使用32位系统进行编译如果使用 64bit 的操作系统编译,这些就都不用修改,但记得需要安装:For 64-bit servers the following extra packages may be needed:
"sudo apt-get install libc6-dev-i386" (libc6-dev-amd64 if AMD CPU)
"sudo apt-get install g++-multilib lib32ncurses5-dev lib32z1-dev"
还有 jdk64bit 的版本编译2 、build/core/base_rules.mk:128:*** frameworks/opt/emoji/jni:
.... libgl2jni already defined by framwworks/base/opengl/tests/gl2_jni/jni 停止

从编译规则上看:
# Make sure that this IS_HOST/CLASS/MODULE combination is unique.
module_id := MODULE.$(if \\
$(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)
ifdef $(module_id)
$(error $(LOCAL_PATH): $(module_id) already defined by $($(module_id)))
endif

在framwworks/base/opengl/tests/gl2_jni/下面定义的android.mk定义了:
LOCAL_MODULE := libgl2jni
include $(BUILD_SHARED_LIBRARY)
导致生成的动态库重复,这是不对的,修改tests这个目录不参与编译即可,最直接的办法删除掉framwworks/base/opengl/tests/gl2_jni这个文件夹

3、AIDL 编译报couldn\'t find import for class原因
“AIDL服务只支持有限的数据类型,因此,如果用AIDL服 务传递一些复杂的数据就需要做更一步处理。AIDL服务支持的数据类型如下:
Java的简单类 型(int、char、boolean等)。不需要导入(import)。String和 CharSequence。不需要导入(import)。
List和 Map。但要注意,List和Map对象的元素类型必须是AIDL服务支持的数据类型。不需要导入(import)。AIDL自动生成 的接口。需要导入(import)。
实现 android.os.Parcelable接口的类。需要导入(import)。
其中后两种数据类 型需要使用import进行导入,传递不需要 import的数据类型的值的方式相同。传递一个需要import的数据类型的值(例如,实现android.os.Parcelable 接口的类)的步 骤略显复杂。除了要建立一个实现android.os.Parcelable接口的类外,还需要为这个类单独建立一个aidl文件,并使用parcelable关键字进行定义。”
没有加LOCAL_AIDL_INCLUDES += xxx ,所以找不到我的parcelable aidl文件。

修改android源码根目录下的build/core/pathmap.mk把你的目录加进去,此时再make update-api

4、老是提示 @Override错误 方法未覆盖其父类的方法
使 用JDK1.6编译没有问题,使用JDK1.5编译,会报@Override方法未覆盖其父类的方法。实际上这个方法是类实现的接口中方法,
但是,这个语 法的jdk1.6的下面是可以通过的,也就是说jdk1.6认为类覆盖父类方法与实现接口方法都叫override,而jdk1.5不
是这样认为的,不知 道这是当初jdk1.5的bug,还是当初就是认为覆盖父类方法与实现接口方法是不一样的,不得而知。但是从
OO角度来看,覆盖父类方法与实现接口方法都 可以认为override,因为他们目的都是一样的,都是为了重用,都是多态的一种
表现方式。

更改jdk版本为1.6即可

5、编译alsa-lib库错误

android系统开发移植alsa-lib库的过程中编译的时候出现了如下的错误
/tmp/cckyaR40.s: Assembler messages:
/tmp/cckyaR40.s:2763: Error: selected processor does not support `mrs ip,cpsr\'
/tmp/cckyaR40.s:2764: Error: unshifted register required -- `orr r2,ip,#128\'
/tmp/cckyaR40.s:2765: Error: selected processor does not support `msr cpsr_c,r2
字面的意思报的是汇编错误,选择的处理器不支持mrs和msr指令。
原来的ARM指令有32位和16位两种指令模式,16位为thumb指令集,thumb指令集编译出的代码占用空间小,
而且效率也高,所以android的arm编译器默认用的是thumb模式编译,问题在于alsa的代码中有部分的内容
用到了32位的指令,所以才会报如下的错误,修改的方法也很简单,在Android.mk中加入如下内容即可:
LOCAL_ARM_MODE := arm
android的编译系统中LOCAL_ARM_MODE变量的取值为arm或者thumb,代表32位和16位两种arm指令集,默认为thumb
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

collect2: ld returned 1 exit status
make: *** [out/target/product/merlin/obj/SHARED_LIBRARIES/libasound_intermediates/LINKED/libasound.so] 错误 1
解决此问题将alsa-lib/include/config.h文件中的如下宏定义去掉即可:
#define VERSIONED_SYMBOLS

开发过程中碰到过很多错误,后续再一一总结记录下来,有些忘记了。。

在android.mk中编译:

include $(CLEAR_VARS)
$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

出现提示需要定义:LOCAL_MODULE_TAGS := optional 一般修改方法是:

build\\core\\definitions.mk 中的宏定义变量:

define include-prebuilt
include $$(CLEAR_VARS)
LOCAL_SRC_FILES := $(1)
LOCAL_BUILT_MODULE_STEM := $(1)
LOCAL_MODULE_SUFFIX := $$(suffix $(1))
LOCAL_MODULE := $$(basename $(1))
LOCAL_MODULE_CLASS := $(2)
include $$(BUILD_PREBUILT)
endef

在这里增加一个LOCAL_MODULE_TAGS := optional

但是这需要修改android源码,如果不是自已的android系统,这么做就麻烦了,所以必须想其它办法解决:

#include $(CLEAR_VARS)
#$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

include $(CLEAR_VARS)
LOCAL_SRC_FILES := libyfcdca.a
LOCAL_BUILT_MODULE_STEM := libyfcdca.a
LOCAL_MODULE_SUFFIX := lib
LOCAL_MODULE := yfcdca
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)

如此即可了。
参考技术A 有什么错误可以贴出来,可以在logcat里面查看具体的错误信息,可以直接点击出错的地方,那样就可以定位到具体的代码行数,查找出错误所在。

新人入项目的一些小提示

本人所在的工作性质,通俗的讲,叫“IT外包”,工作经历上即是所谓的“项目”。本人技术水平并不高,并且经历的项目目前也不多,但还是想把在包括实习期在内的的入职两年的时间里的一些经验分享给刚入场的技术新人们。如果在经验丰富的前辈们面前班门弄斧了还请见谅!

 

一. 电脑软件配置与基本技能

0. 这是最基础的,作为一个开发人员,请将电脑系统的隐藏文件后缀名关掉。

1. 所涉及语言的代码编辑器(编译器),并且熟悉其各种快捷键。像“撤销”、“查找”、“替换”这类快捷键,事实上无论是不是打代码的小伙伴,在使用相应的编辑器时,都是很基本的东西了,不熟练掌握都不好意思说自己是一个IT人。另外,像一些比较傲娇的开发工具,比如form builder这种既要编辑程序单元又要配置各种属性还得兼顾各种触发器代码的,如果不知道怎么查找代码,想知道某个功能是哪段代码实现的时候,是无助得想撞墙的。

2. 常用软件配置。

    A. 远程命令工具 securitClient,Xshell等

    B. 文件传输工具 fileZilla等

    C. 文件搜索工具 everything等

    D. 比较好用的通用编辑器 sublime,notepad等

    C. 多款浏览器(WEB开发相关) 流氓IE就不说了,谷歌和火狐建议还是装上

3. 如果会接触到linux服务器,linux命令是必不可少的,如果像网上的linux教程、鸟哥的linux私房菜、Shell脚本学习指南这些懒得看的话,以下这些最最基础的linux命令请稍微记一下:

    A. ls 显示当前目录的内容

    B. cd [your directory] 进入你要进入的目录

    C. pwd 显示当前目录

    D. mkdir [your directory]  创建目录

    E. touch [your directory] 创建文件

    F. history 查看历史执行过的linux命令

    G. mv [source file] [target file] 移动文件(也可用于重命名)

    H. 像rm这种可能导致跑路事件的命令我就不多说了

    I. 上述命令,如果你是个linux小白,使用之前请先跟谷歌或度娘打声招呼

4. 学会如何解决问题

    这一点说的有些虚,毕竟并没有解决问题的万能方法。但是你需要有思路,基于能够更好地成长的原则,首先是自己先思考,如果实在想不出,求助谷歌和度娘,这个年代,如果不会使用搜索引擎去查找解决问题的方法,耐克的“just do IT”这句广告白费了。最终的最终,当真的无法找到答案或解决方法时,向有经验的人求助。

5. 学会问问题

 

二. 项目了解

1. 项目成员

    A. 项目经理

    B. 技术总监

    C. 技术负责人

    D. 其他顾问,包括你自己在内的业务顾问与技术顾问

    E. 客户

2. 项目进展

    项目什么时候开始什么时候结束,你进场项目时项目处于什么阶段,这些最好都了解,即使是新人,也是项目组的一份子,时刻了解项目的进展情况,对自己为项目更好地付出是有帮助的。

 

三. 注意事项

1. 码过留痕

    无论何时何地,只要你动了代码,无论动的是什么年代的你自己的还是老前辈的还是其他新人的代码,一定一定留注释

    此处的注释包括,一般包括两点:

    A. 修改时的信息,包括修改者、修改时间

    B. 修改时的目的

    C. 此处再乱入第三点:如果你是修改或者删除一段代码,请不要删除掉原来的代码,正确的做法是:

         注释掉原来的代码,如果是修改,就紧接着编写修改后的代码

    举例如下:

    目前有一个代码(假设语言是java)段如下:

    x = 1

    因为需求A,需要修改为x = 0,可以如此修改

    // updated by [email protected] begin

    // 因需求A需要调整x的赋值

    /*x = 1*/

    x = 0

    // updated by [email protected] end

    如果的的确确确确实实实实在在是时间很紧,至少标上修改者或者修改日期,至少自己或者其他后来者看的时候,能够知道这段代码曾经改过。

    请相信我,相比于之后自己忘记或者其他同事找不到代码修改过的地方的代价,以及被打断后恢复思路所耽误的时间,打上个名字或者日期的时间真的微不足道。

2.邮件是甩锅的唯一标准

    这里并不是指拿邮件来推卸责任,更不是说有了一封邮件你就可以不顾后果地按邮件说的做并且最后能够理直气壮地争辩。邮件的作用是:

    A. 记录

        比如,业务顾问请你帮忙部署代码,如果只是口头说一声,可能一个星期之后大家都忘了当时有没有部署了,有邮件的情况下,事情会变得很清晰

    B. 明确责任范围,排除模棱两可的争议

        一件事情,怎么做,由谁来做,最后要达到的结果是什么,事情的截止时间等等,如果没有邮件,在工作效率以及交付质量上都是很难把控的

3. 把生产环境当成刚出生的宝宝重点呵护和保护

    A. 不要轻易动代码

    B. 不要轻易动数据

    C. 如果真要动代码或者动数据,请先回顾一下“甩锅的唯一标准”

4. 养成良好的代码规范习惯

5. 如果想说什么,就说出来,不要憋在心里。(向女生表白这种事情请自己把握)

     在项目上,如果觉得方案设计有问题,或者某段代码会导致不可逆的风险时,一定一定提出来让别人听到,不要拖到悲剧发生

     如果真的是代码或者方案有问题,就能够及时避免不必要的损失。

     如果是你自己想错了,没关系,大家一块讨论一块分析,确定方案或者代码没有问题就好了,不会多一块肉少一块肉。

     如果没有说出来,最后真的悲剧发生了,后悔也来不及了。

 

时间有点晚了,今天写到这里,后续继续完善,希望目前的可以帮助到大家。

以上是关于新人求教,编译一个最简单的Android程序,提示下面的错误咋解决的主要内容,如果未能解决你的问题,请参考以下文章

新人求教,编译一个最简单的Android程序,提示下面的错误咋解决

新人求教,急.qt4.8.6无法编译

Linux下用交叉编译器编译报错缺少Libc.so.6【求教】

新人求教gpu的使用和keras调用

新人求教,请问Thinkphp 中怎么捕获异常,自己进行处理

新人学BBOX,向高手求教……