当前位置:首页 » 安卓系统 » androidc编译

androidc编译

发布时间: 2023-01-31 23:28:35

1. 怎么将c代码编译成android可执行程序

(1) 如果你开发Android上层APP,使用Android NDK,将下面c语言开发的lib通过JNI接口给上层APP使用。
(2) Android底层本来就是linux,如果是搞底层的东西,这和在Linux下开发C语言程序没什么区别。

2. Android上如何用C语言编程

害哥搞这个离线包搞了个把小时。为了清楚,上个图: 敲个LS,什么东西都没有,这个目录是cygwin的安装目录下面的home文件夹下的用户名文件夹。接下来是配置与Android相关的。在home/用户名,这个文件夹下有一个文件为.bash_profile,打开它,到最后添加两行NDK的环境变量:NDK_ROOT=/cygdrive/d/android-ndk-r6export NDK_ROOT上面的意思是,ndk的目录是,d:/android-ndk-r6添加完之后,关闭Cygwin重新启动一下,然后敲入cd $NDK_ROOT,是否进入到ndk的目录了?否则就看看哪个字母错了。在ndk的目录下samples下有很多例子,随便弄个就可编译了。下面是新建一个项目,以对C语言在项目中的位置更清楚。打开Eclipse新建一个Android项目,取名hellojni,为了清晰,便于维护,及各种各样的好处,JNI的JAVA代码单独一个类,单独一个包。其实最好能不用JNI就别用JNI,这东西负作用巨大,特别是在用到JNI复杂的地方,什么内存啊,类型啊,哪里调用的方法,异常啊,可靠性都非常麻烦。非要用JNI的复杂功能,做好两件事,做之前充分设计,设计之前充分学习一下JNI文档。当然对于一些简单的应用,那只需要充分仔细。作好参数,返回值的检查,记得释放内存就行了。

3. 如何利用android studio 编译c code

学习 android 逆向分析过程中,需要学习 Arm 指令,不可避免要编写一些 test code 并分析其指令,这是这篇文档的背景。

在目前 android 提供的开发环境里,如果要编写 c / cpp code, 一般是通过 ndk 开发套件,基本方法就是在
windows 或 linux 发行版上下载 ndk 环境,然后编写 c / cpp code 然后编写 Android.mk 文件,最后用
ndk-build 等工具进行编译,编译出来的可执行文件再通过 adb push 的方式提交到 devices 或 emulator
运行,如果要分析其指令,需要下载 android 提供的 prebuilts binutils 工具集(如android 源码
prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/arm-linux-androideabi/bin/
目录),如果你在linux上用file命令查看一下这些工具,会发现 :

root@ubuntu:bin# file objmp
objmp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped

它们是x86架构的,这样,你要分析devices或emulator里的elf文件,需要adb pull 下来,放在本地的linux环境或者windows里,用上述prebuilt工具分析。

稍微思考一下就会发现上述 ndk
的方式,对我们的需求来说有点太复杂了,我们真正希望的是像在标准linux发行版上那样,可以用vi/vim等编辑工具写 c/cpp
code,然后用 gcc /g++ 等编译工具编译,然后能直接运行或者用gdb调试,
或者用readelf/objmp等命令查看elf结果和汇编码。问题变成了:如何在android上实现这一切?

下面的方式是经过本人收集和实际测试证明可行的,我的环境是:

目标机:小米2手机, android4.4.4, miui 6.3.5

本地机: win7

效果:在本地机adb目标机的shell, 然后用vi写 c/cpp code, 直接在shell上用gcc编译,用objmp分析指令

实现步骤如下:

1. 首先安装 busybox apk . 这个app提供了后续需要的 busy vi, busy tar 等工具

2. 下载 adb putty ,http://yunpan.cn/cZ5x9UrDFUDdK (提取码:e70e)

这个工具用来做终端,这里为什么不用win7自带的cmd或者其他增强版如 powerCmd 呢? 因为用 windows 的 cmd 终端,adb shell 连接上手机后,执行 busybox vi 等命令,会出现乱码,参考http://www.hu.com/question/20624475, 用这款 adb putty 终端则可以正常使用。

3. 下载 gcc arm,http://yunpan.cn/cZ5YVZzbvJqq4 (提取码:80b8)

4. 手机的Android系统能在手机上用C/C++编程吗

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

5. 手机能否装C语言编译器

可以装,不过需要安卓手机

安装步骤如下:

1、我们打开谷歌应用商店。在搜索框里输入mobile c查找应用程序。下载并安装好

6、可以看到这里正确的输出了Hello World字符串。

6. 如何建立android的C/C++交叉编译环境

Android的底层是纯粹的linux内核,可以简单的理解为上面跑了个Dalvik Java虚拟机而
已。因此,构建android上C/C++的交叉编译环境也就成为了一个很大的需求。特别是对于已经取得root权限的机器,如果能直接运行按需编译的二进制文件,那么将可以做很多有意义和有趣的事情。
很不幸,Google没有直接给出如何建立这个交叉编译环境,但是我们可以借助Google提供的强大的NDK (Native Development Tools)来达到这一目的。
NDK的本来目标是编译得到.so动态链接库文件,然后通过JNI提供给上层的Java调用,从而实现C/C++程序的简易迁移。而编译.so和编译成二进制可执行文件的过程是完全一样的,这就给了我们可以发挥的空间。

7. 在android中如何编译连接 c 的可执行文件

1. 在./development目录下创建一目录 如:myhello
2. 进入hello目录,在其下编写自己的.c文件,如: myhello.c
#include <stdio.h>
int main()
{
printf("hello world\n");
exit(0);
//return 0;
}
3. 在hello目录中,编写Android.mk, 内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myhelloworld
LOCAL_SRC_FILES := myhello.c
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
4. 回到Android源代码顶层目录,进行编译,make myhelloworld
5. 生成的可执行文件位于:out/target/proct/lotus/system/bin/ 目录下
6. adb push 到手机 /data 目录下,然后进入adb shell,到data目录下,执行./myhelloworld 皆可

手动编译连接【arm-eabi-gcc 的目录随andorid的版本而有变化,还有就是需要链接的文件如果比较多时,需要很多-l 就很麻烦了】
7、编译成目标文件:
#$(yourAndroid)/prebuilt/linux-x86/toolchain/[arm-eabi-4.2.1]/bin/arm-eabi-gcc -I bionic/libc/arch-arm/include/ -I bionic/libc/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -g -c helloworld.c -o hello.o
8、生成可执行代码:
#$(yourAndroid)/prebuilt/linux-x86/toolchain/[arm-eabi-4.2.1]/bin/arm-eabi-gcc -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,noreloc -o helloworld -Lout/target/proct/[generic]/obj/lib -Wl,-rpath-link=out/target/proct/[generic]/obj/lib -lc hello.o -entry=main

其中[ ]中部分根据实际情况修改

**************************************************
实验:
1. 建目录(my Android)/development/test, 在该目录下新建 Android.mk和fb_test.c文件

2. Android.mk文件

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myfbtest
LOCAL_SRC_FILES := fb_test.c
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)

3. 以下为fb_test.c
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <linux/kd.h>

#include <stdio.h>

#define FBBIT_PER_PIXEL 32
#define FBBIT_PIXEL_IMAGE 16
#define PIXELS_WIDTH_BYTE 4
#define BYTE_PER_PIXEL 3
#define FB_GRAPHICS_PATH "/dev/graphics/fb0"
#define DEV_TTY0_PATH "/dev/tty0"

#define DISPLAY_ERROR -1
#define DISPLAY_SUCCESS 0

#define GET_BATTERYCAPACITY_ERR -1

#define MAX_STR 255

static struct {
int fd;
void *pixels;
struct fb_fix_screeninfo fixed;
struct fb_var_screeninfo var;
int align_xres;
} fb;

int getBatteryCapacity(void)
{
FILE *in;
char tmpStr[MAX_STR + 1];
char capfile[] = "/sys/class/power_supply/battery/capacity";

if (capfile == NULL)
return GET_BATTERYCAPACITY_ERR;

in = fopen(capfile, "rt");
if (in == NULL)
return GET_BATTERYCAPACITY_ERR;

if (fgets(tmpStr, MAX_STR, in) == NULL) {
printf("Failed to read battery capacity!\n");
fclose(in);
return GET_BATTERYCAPACITY_ERR;

}

printf("Battery capacity(ascii): %s\n", tmpStr);
fclose(in);

return 0;//atoi(tmpStr);
}

static int vt_set_graphicsmode(int graphics)
{
int fd, r;
fd = open(DEV_TTY0_PATH, O_RDWR | O_SYNC);
if (fd < 0)
return DISPLAY_ERROR;
r = ioctl(fd, KDSETMODE, graphics);
close(fd);
return r;
}

int display_init(void)
{
fb.fd = open(FB_GRAPHICS_PATH, O_RDWR);
if (fb.fd < 0)
return DISPLAY_ERROR;

if (ioctl(fb.fd, FBIOGET_FSCREENINFO, &fb.fixed) < 0)
return DISPLAY_ERROR;
if (ioctl(fb.fd, FBIOGET_VSCREENINFO, &fb.var) < 0)
return DISPLAY_ERROR;
fb.align_xres = fb.fixed.line_length /
(fb.var.bits_per_pixel >> BYTE_PER_PIXEL);

fb.pixels = mmap(0, fb.fixed.line_length * fb.var.yres_virtual,
PROT_READ | PROT_WRITE, MAP_SHARED, fb.fd, 0);
if (fb.pixels == MAP_FAILED)
return DISPLAY_ERROR;

vt_set_graphicsmode(KD_GRAPHICS);

memset(fb.pixels, 0, fb.fixed.line_length * fb.var.yres_virtual);
//display_update(fb.pixels, fb.align_xres, fb.var.yres);
fb.var.activate = FB_ACTIVATE_FORCE;
ioctl(fb.fd, FBIOPUT_VSCREENINFO, &fb.var);

printf("display_init ok\n");

return DISPLAY_SUCCESS;
}

void display_on(void)
{
ioctl(fb.fd, FBIOBLANK, FB_BLANK_UNBLANK);
}

void display_off(void)
{
ioctl(fb.fd, FBIOBLANK, FB_BLANK_POWERDOWN);
}

int main()
{
display_init();
display_off();//关显示屏

getBatteryCapacity();
sleep(5);

display_on();//开显示屏

return 0;
}

8. 有能在Android系统上运行的c语言编程软件吗,推荐一下

C4droid是款Android设备上的C/C++程序编译器[2] ,默认以tcc(tiny c compiler)为编译器,可以选择安装gcc插件(20mb,只有root用户可以使用),选用gcc后,可以用sdl(简单直控媒体层库,需安装sdl plugin for c4droid)和qt(nokia官方开发库,需安装sdl plugin for c4droid)。也可以开发native android app(需安装sdl plugin for c4droid),就像google ndk一样。软件支持代码高亮,编译时间随cpu主频而定,主频越高编译越快。gcc插件版本4.7.2提供了示列程序,包含sdl,android native,qt和命令行测试程序源码。

9. 有没有安卓手机c语言编译软件

有的 我现在也正在用C4 droid 我是看视频学的,我现在正在看的是夏老师的,感觉还不错,比较适合像我这样0基础的。这个比较吸引我的地方就是讲的一听就能听懂。而且很多概念都有形象的比喻,例如把变量比如成盒子。把变量赋值比喻成往盒子里放东西等等很多这样的比喻。感觉特别容易理解。

热点内容
搜解压缩 发布:2024-05-17 15:38:32 浏览:764
水泵扬程算法 发布:2024-05-17 15:37:29 浏览:977
英雄联盟技能脚本 发布:2024-05-17 14:59:41 浏览:444
全名k歌安卓手机里面怎么录屏 发布:2024-05-17 14:40:07 浏览:180
常用数据库介绍 发布:2024-05-17 14:31:38 浏览:504
中孚存储介质信息消除工具 发布:2024-05-17 14:31:33 浏览:589
服务器访问ip如何调转主页 发布:2024-05-17 14:30:33 浏览:789
好玩的解压化妆小游戏 发布:2024-05-17 14:10:57 浏览:127
交通银行怎么登陆不了密码 发布:2024-05-17 13:54:48 浏览:543
安卓如何自动连接无线 发布:2024-05-17 13:53:51 浏览:262