NO.1c4droid一款手机上的c语言编译器。个人认为手机上最好用的,没有之一!c4droid是款Android设备上的C/C++程序编译器。
NO.2AIDE功能强大,内置学习教程。
AIDE是一个AndroidJava集成开发环境,可以让你在Android系统内进行Android软件和游戏的开发。
NO.3我的应用iapp专为手机研发,代码编写简单,学习容易。iapp还很年轻,特别需要大家的支持!NO.4cppdroid和c4droid一样,是一款手机上的c语言编译器。安卓上的C/C++编译环境,可以帮助你在手机上编写c/c++程序,和c4droid各有优点,cppdroid最大的优点就是可以即时报错,写一个字符就检查一遍,保证程序的正确性,而且编译速度快,虽然还有部分地方赶不上c4droid,但是和c4droid搭配还是不错的。
1. 在./development目录下创建一目录 如:myhello2. 进入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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)