在android代码中编译一个可执行文件,主要功能是对文件的读写,

简单贴出来:

  1. #include <errno.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. void read_data(void){
  7. char readBuf[640*1024];
  8. char *path = "/boot0_nand";
  9. FILE* fp= fopen(path,"rb");
  10. if(!fp){
  11. printf("can't open %s\n",path);
  12. }
  13. size_t len = fread(readBuf,sizeof(char),sizeof(readBuf),fp);
  14. printf("read len = %d \n",(int)len);
  15. fclose(fp);
  16. }
  17. int main(int argc, char** argv) {
  18. int ret;
  19. int opt;
  20. read_data();
  21. }

起初,是用android的编译环境,定义了android.mk文件如下:

  1. include $(CLEAR_VARS)
  2. LOCAL_SRC_FILES := writeBoot/write_boot.c
  3. LOCAL_MODULE := write_boot
  4. LOCAL_FORCE_STATIC_EXECUTABLE := true
  5. LOCAL_MODULE_TAGS := eng
  6. LOCAL_STATIC_LIBRARIES := libstdc++ libc libcutils
  7. include $(BUILD_EXECUTABLE)

编译通过,但是执行到fread的时候,就报错了:Segmentation fault
一直搞不明白,那么简单的代码,就报这个错误!
无奈,实在是没办法,就用gcc来编译,方法如下:

  1. gcc write_boot.c -o write_boot

把write_boot推到小机,修改权限,执行,又报错:not executable: magic 7F45
网上查了一下,通过Android NDK来编译生成,这个比较简单:
编辑一个脚本如下,命名agcc:

  1. #!/bin/sh
  2. OS='linux'
  3. ANDROIDSDK='android-14'
  4. ANDROID='/home/xiongtie/workspace/A31/android41'
  5. PROGDIR='/home/xiongtie/workspace/A31/android41/prebuilts/ndk/android-ndk-r7/'
  6. PROGDIR=`cd $PROGDIR && pwd`
  7. ARMEABIGCC=$ANDROID/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-gcc
  8. ARMEABILIB=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/lib
  9. ARMEABIINC=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/include
  10. ARMEABICRT=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/lib/crtbegin_dynamic.o
  11. LINKER=/system/bin/linker
  12. echo "GCC:"$ARMEABIGCC "LIB:"$ARMEABILIB "LINKER":$LINKER "PARAMS:"$@
  13. $ARMEABIGCC $@ -Wl,-rpath-link=$ARMEABILIB,-dynamic-linker=$LINKER -L$ARMEABILIB $ARMEABICRT -I$ARMEABIINC -nostdlib -lc

编译名如下:

  1. ./agcc  write_boot.c -o write_boot

再推到小机执行,ok,完成了

Android上运行本地c的更多相关文章

  1. 编译可在Android上运行的qemu user mode

    前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的”NDK”若无特殊说明均指”Android NDK”. 下文中”$NDK ...

  2. 系列篇|编译可在Android上运行的依赖库(一):glib库

    前言 这是系列文章,它们由<编译可在Android上运行的glib库>及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出.由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库 ...

  3. react native-调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错

    调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错,而在iOS上运行没问题.原因是因为接口是有验证信息的,而调用这个插件时没有传入,在iOS上会自动加 ...

  4. 在Android上运行Java和C程序

    在linux上运行java程序,直接用javac编译,再用java启动虚拟机运行就行了.但是在Android上,由于虚拟机和pc端的不同,所以操作方法也是不一样的.下面介绍Android上运行Hell ...

  5. 在 android 上运行 python 的方法

    在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的事情,因为python脚本真是非常高效,另外,有很多非 ...

  6. Unity3D之AssetBundle学习:Android上运行笔记

    路径统一 在Android上加载StreamingAssets文件夹下的AssetBundle文件,首先需要对加载地址进行处理,注意PC.Android和IOS的地址不一致需要针对不同的平台不同的处理 ...

  7. 在Android 上运行 openCV ,并做灰度变化的一个例子

    OpenCVImageProcessing1. 导入Opencv的 androrid SDK灰度算法 OpenCVImageProcessing 导入opencv Jar包,配置OpenCVLibra ...

  8. 在Android上使用qemu-user运行可执行文件

    在Android上使用qemu-user运行可执行文件 作者:寻禹@阿里聚安全 前言 QEMU简要介绍: QEMU可以解释执行可执行程序.既然QEMU可以解释执行可执行程序,那么QEMU就能够知道执行 ...

  9. 准备开发一个运行在Android上的JavaME模拟器

    在一个虚拟机A上运行另外一个虚拟机B看起来是挺不靠谱的一件事,在手机上运行某个虚拟机也不怎么靠谱.并且如果虚拟机A运行在手机上这个听起来就更不靠谱了.但是很多人就在做这样的事.比如在在手机上运行DOS ...

随机推荐

  1. 阅读express的感悟

    在github上看了半天的源码,也是云里雾里,勉强也算看完了,通过查看很多人的讲解也方便了我的理解,今天记录下来,也算是做个笔记. 进入express的源码文件里我们可以看到8个文件:middlewa ...

  2. LINUX USB MASS STORAGE DRIVER流程图

  3. 全选demo

    我们处理数据时,最好能够支持全选操作. 选中之后,进行删除,或其他处理. 我自己写了一个demo. 主要功能: 1.点击全部选中 2.点击全部取消 3.然后进行获取选中的id,进行处理 代码如下: & ...

  4. cf459C Pashmak and Buses

    C. Pashmak and Buses time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. 定时PING下IP地址,检测该服务器是否还活着。 smokeping

    http://oss.oetiker.ch/smokeping-demo/?displaymode=n;start=2014-10-16%2007:00;end=now;target=SIP

  6. 10年程序员谈.Net程序员的职业规划(图/文)

    原文地址:http://bbs.csdn.net/topics/390736769 从事Dotnet程序开发工作近10年了,从开始的月薪3k的小程序员菜鸟,到现在年薪60w的项目总经理,从战战兢兢的去 ...

  7. 每日一dp(2)——龟兔赛跑(hdu 2059)

    比較经典的动态规划的题目了 一般动态规划的想法都是先推断是否有最优子结构,无后效性.接着从状态转移入手,尽量细分状态(即给定N得到N+1),完了再递推计算 难点:转移方程,其一般也难在怎样描写叙述一个 ...

  8. HTML5音乐可视化

    环境搭建 1,安装nodejs和Git,配置环境变量2,安装express,npm install -g express-generator3,创建项目,express -e music(项目名称)4 ...

  9. Android自定义工具类获取按钮并绑定事件(利用暴力反射和注解)

    Android中为按钮绑定事件的有几种常见方式,你可以在布局文件中为按钮设置id,然后在MainActivity中通过findViewById方法获取按钮对象实例,再通过setOnClickListe ...

  10. 解决IP地址被占用问题

    问题背景: 在公司一直有同事在抱怨IP地址总是被占用的问题,我决定用技术解决这个问题 解决方案: 1 最开始想在防火墙里面做IP和mac地址绑定,做了几个之后,还是有同事在说IP被占用,后来 分析了一 ...