zoukankan      html  css  js  c++  java
  • 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,完成了

  • 相关阅读:
    spring和mybatis整合配置文件
    点击不同按钮,加载不同的页面(不使用iframe的情况下)
    两个完整的jquery slide多方面滑动效果实例
    autofac无法解析一例
    c# Random太快产生的随机数会重复
    linq和ef关于group by取最大值的两种写法
    JavaScript 汉字与拼音互转终极方案 附JS拼音输入法
    使用USB Key(加密狗)实现身份认证
    让Dreamweaver支持cshtml (MVC Razor环境)
    使用EF扩展EntityFramework.BulkInsert实现批量插入
  • 原文地址:https://www.cnblogs.com/kuloud/p/3562192.html
Copyright © 2011-2022 走看看