当前位置:首页 » 编程软件 » 安卓指令集再编译

安卓指令集再编译

发布时间: 2024-09-09 22:35:33

❶ 手机的Android系统能在手机上用C/C++编程

可以,有个手机编程软件叫做C4droid,专门用来编译C/C++文件的,要下载支持库,不大的,你可以看看

❷ 新人求教,编译一个最简单的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.
mole_id := MODULE.$(if \
$(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)
ifdef $(mole_id)
$(error $(LOCAL_PATH): $(mole_id) already defined by $($(mole_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/proct/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.
mole_id := MODULE.$(if \
$(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)
ifdef $(mole_id)
$(error $(LOCAL_PATH): $(mole_id) already defined by $($(mole_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/proct/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)

如此即可了。

❸ 华为鸿蒙兼容安卓APP,windows11也支持安卓APP,有什么不同

6月2日,华为鸿蒙正式发布,而华为的HarmonyOS是兼容安卓APP的,也正因为如此,所以华为鸿蒙系统一直被很多人吐槽,有些喷子直接说是安卓套壳。

6月24日,windows11发布,这次的windows11也给大家带来了一个巨大的惊喜,那就是windows11也是原生支持安卓APP的。

但这次的windows11却没有被人说是安卓套壳了,那么问题就来了,这两个系统支持安卓APP,究竟有何区别?

首先说说鸿蒙系统,我们知道鸿蒙系统的基础是Openharmony这个开源项目,它本身是不支持安卓APP的,是一个相对纯净的系统。

而华为HarmonyOS是基于Openharmony有,再打包了安卓开源项目AOSP中的一些代码,让它能够支持安卓APP。

由于华为HarmonyOS也是用于ARM芯片上的,安卓系统也是基于ARM芯片的,芯片指令集是一样的,同时安卓与HarmonyOS都是基于linux内核来的,所以只要打包AOSP中的代码,让Harmony有一个安卓APP的编译器就行了。

但windows不一样,首先windows的内核是WINNT,其次windows主要用于X86架构,这是复杂指令集,与ARM的简单指令集是不一样的。

所以windows不是简单的打包AOSP的代码,让windows中有一个安卓APP编译器就可以的。

windows11是利用了英特尔的 Intel Bridge技术,这是一种运行时后期编译器,能让移动应用在基于X86 的 设备上,以“原生应用”形态运行。

估计这样一说,大家还是云里雾里的,不明白。 Bridge技术究竟是一种什么技术?

我们知道intel的芯片是X86的架构的,安卓的APP主要用于ARM架构的,而intel的 Bridge技术,类似于一种所谓的“桥”,在 英特尔的芯片上也可以运行 ARM的二进制文件,这样解决了指令集的问题。

然后微软又在w indows中开发了一个“安卓 Windows 子系统”(WSA),与 Windows 中已经存在的“Linux Windows 子系统”相似,然后当然就打包了AOSP中的代码,提供了与 AOSP 框架的兼容性,最终实现原生运行安卓APP。

所以这华为鸿蒙与windows11支持安卓APP,还真的不一样,最大的关键就是芯片指令集的不同,导致微软先要解决芯片指令集的问题后,才能搞定安卓的问题,而鸿蒙不需要考虑指令集的问题。

❹ 关于android和x86的几点疑问。 android基因linux内核,系统除了内核还有其他什么

android 除了基于 Linux 内核,他的上层运行环境和相关函数库,命令程序都是自己的。
其实 android 就是一个基于 Linux 内核的 JAVA 虚拟机环境。
实际 Android 程序都是基于 JAVA 虚拟机跑的解释型语言程序。

但解释型语言程序性能肯定不如本地二进制程序。所以 Android 还有一种 NDK 程序。
也就是 Android 里面有部分本地二进制程序的内容。这样本地程序方式运行,效率可以最高而且可以根据 CPU 功能做优化(比如 neon )。

指令集不同,但他的 JAVA 虚拟机是解释型语言,基于 JAVA 语言的程序是可以无差别运行的。只要能保证 Android 上面的 JAVA 虚拟机可以在 x86 上面成功运行就行了。

但 Android 有个另外的问题,就是 JAVA 虚拟机是针对 ARM 做性能优化的,在 X86 上面,这种性能优化都没了,需要另外在 x86 上面重新优化。但听说 Android 的 JAVA 虚拟机的语言里面,也有针对 ARM 硬件进行的修改设计,所以这种针对 ARM 性能优化的 JAVA 程序,在 X86 的系统上面性能也有损失。

所以 Android 出来很久后,在 x86 上面的运行效率都一直不怎么样。

而且现在还有 NDK 程序的出现, ARM 的二进制程序在 x86 上面是不能运行的。这些程序都不能运行。
不过 x86 有个优势就是自己的性能很强,而且模拟器技术现在也很强了。在 x86 上面,可以借助虚拟机(qemu 的 user mode 就值得看看)来运行 ARM 的二进制程序。
不过虚拟机其实还是有性能损失的。

所以未来,Android 的跨 CPU 架构依然还是问题。纯 JAVA 程序好说,用了 NDK 的程序就是问题了。

不过 llvm 这个编译器又给了另外一条路,既可以虚拟机方式运行,又可以编译成本地程序而成为二进制程序来优化性能运行。或许 Android 会考虑使用这种方法或者类似的让 NDK 程序可以跨 CPU 实现。代价是 Android 要自带一个编译器,体积也不小的。

MAC OS X 还有一种方法。在 MAC 放弃 IBM 的 Power CPU 而改用 Intel 的 CPU 后,他的程序都是里面附带两套二进制程序,老的 G4 CPU 的机器,就用程序里面的 power 指令集的程序代码。新的 Intel CPU 的机器,就自动用里面的 x86 指令来运行程序。从而实现完美的双指令集运行。不过代价是这样的程序都是两套指令集的内容,体积翻倍。

目前来说,似乎用了 NDK 的程序还都不能用的。不排除现在某些 x86 的手机,使用了虚拟机技术来实现运行 NDK 程序。现在 Linux 下面的 qemu 的 usermode 配合内核的 binfmt_misc 功能,可以让系统自动识别某个架构的程序,去调用 qemu 来执行。

热点内容
小米怎么查看云相册密码是什么 发布:2024-11-25 01:46:38 浏览:686
不同的语言编译原理 发布:2024-11-25 01:30:37 浏览:315
c编译成c 发布:2024-11-25 01:29:12 浏览:105
飞腾编译gcc 发布:2024-11-25 01:28:32 浏览:153
服务器文档设备存储需要检查什么 发布:2024-11-25 01:27:10 浏览:342
名词算法 发布:2024-11-25 01:24:54 浏览:675
我的电脑玩cf卡该换什么配置 发布:2024-11-25 01:20:38 浏览:871
云加密服务是什么情况 发布:2024-11-25 01:18:16 浏览:881
租云服务器会提供ip吗 发布:2024-11-25 01:18:13 浏览:451
安卓原生刷机包在哪里下载 发布:2024-11-25 01:13:16 浏览:298