• Android上运行本地c


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

    简单贴出来:

    [cpp] view plaincopy
     
    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 ",path);  
    12.     }  
    13.   size_t len = fread(readBuf,sizeof(char),sizeof(readBuf),fp);  
    14.     printf("read len = %d  ",(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文件如下:

    [plain] view plaincopy
     
    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来编译,方法如下:

    [plain] view plaincopy
     
    1. gcc write_boot.c -o write_boot  


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

    [plain] view plaincopy
     
    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  

    编译名如下:

    [plain] view plaincopy
     
    1. ./agcc  write_boot.c -o write_boot  

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

  • 相关阅读:
    java.io.EOFException ValueOperations.increment()操作后,获取值时有的bug
    使用maven profile指定配置文件打包适用多环境
    关于3Q大战和反垄断
    在ECUG2010上的演讲稿
    让Windows7在启动时自动挂载虚拟磁盘
    也谈并行计算(一)C#版的Parallel.For实现
    给.NET的string类添加一个命令行参数分解的扩展
    顺序表 code
    很高兴开始博客之旅 code
    (原)前端知识杂烩(css系列)
  • 原文地址:https://www.cnblogs.com/kuloud/p/3562192.html
Copyright © 2020-2023  润新知