快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

android编译c,android编译clang错误

android studio开发工具编译C、c++代码生成so文件

目前android studio 还不支持 ndk开发,如下图是官网的说明:

成都创新互联公司专注于临沧网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供临沧营销型网站建设,临沧网站制作、临沧网页设计、临沧网站官网定制、微信小程序开发服务,打造临沧网络公司原创品牌,更为您提供临沧网站排名全网营销落地服务。

由于android studio 目前还是测试版,所以不建议直接项目开发时使用,谢谢!

怎么使用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/product/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,nocopyreloc -o helloworld -Lout/target/product/[generic]/obj/lib -Wl,-rpath-link=out/target/product/[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;

}

安卓手机上可以用的编程软件c语言的系统有哪些?

C4droid\x0d\x0a\x0d\x0aC4droid是一个C / C + + IDE + C / C + +编译器,GNU Makefile文件,SDL和Qt支持的Android。 C4droid支持ARM处理器(而不是设备与英特尔的x86和MIPS处理器)的设备。\x0d\x0a您\x0d\x0a可以创建自己的应用程序在Android手机中,运行(即使没有上网:编译器为离线状态)和出口的可执行文件(为终端的应用程序)或APK(GUI使用的\x0d\x0a应用程序)。此应用程序使用TCC和uClibc(GCC仿生libc的一个插件),所以它有完整的ANSI C和ISO C99支持。 \x0d\x0aC4droid可用于教育目的或在C和C + +语言的练习。\x0d\x0aC4droid支持语法高亮,代码完成和源代码格式,所以它是一个非常方便的工具,在旅途中进行编程。

如何编译Android动态链编的native c/c++code

编译环境要求:下载Android的源码,并执行完一次完整的编译。以下的所有命令均是在编译后的源码根目录下执行。

1. 编译C code

同样以hello.c为例:

#include stdio.h

#include stdlib.h

int main()

{

printf("hello, world!\n");

return 0;

}

执行以下步骤生成动态链编的binary文件:

生成目标文件: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/libstdc++/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -include system/core/include/arch/linux-arm/AndroidConfig.h -c -o hello.o hello.c

生成可执行程序: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,nocopyreloc -o hello -Lout/target/product/generic/obj/lib -Wl,-rpath-link=out/target/product/generic/obj/lib -lc -lstdc++ out/target/product/generic/obj/lib/crtbegin_dynamic.o hello.o -Wl,--no-undefined ./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a out/target/product/generic/obj/lib/crtend_android.o

用命令file查看生成的hello文件属性:

hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped

可以证明此时的hello是一个动态链编的文件。

2. 编译native c++ 代码

以hello_cpp为例:

hello_cpp.h

#ifndef HELLO_CPP_H

#define HELLO_CPP_H

class Hello

{

public:

Hello();

~Hello();

void printMessage(char* msg);

};

#endif

hello_cpp.cpp

#include stdio.h

#include "hello_cpp.h"

Hello::Hello()

{

}

Hello::~Hello()

{

}

void Hello::printMessage(char* msg)

{

printf("C++ example printing message: %s", msg);

}

int main(void)

{

Hello hello_obj;

hello_obj.printMessage("Hello world!\n");

return 0;

}

执行以下命令完成:

编译目标文件:prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-g++ -I bionic/libc/arch-arm/include -I bionic/libc/include -I bionic/libstdc++/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -include system/core/include/arch/linux-arm/AndroidConfig.h -fno-exceptions -fno-rtti -c -o hello_cpp.o hello_cpp.cpp

编译可执行程序:prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm- eabi-g++ -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -o hello_cpp -Lout/target/product/generic/obj/lib -Wl,-rpath-link=out/target/product/generic/obj/lib -lc -lstdc++ out/target/product/generic/obj/lib/crtbegin_dynamic.o hello_cpp.o -Wl,--no-undefined ./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a out/target/product/generic/obj/lib/crtend_android.o

同样用file查看hello_cpp的文件属性:

hello_cpp: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped

但是很不幸的是,android自带的toolchain不支持C++标准库的开发,即所有的std namespace下的类均无法使用,包括基本的string。


当前文章:android编译c,android编译clang错误
本文网址:http://6mz.cn/article/dsisghg.html

其他资讯