Android上运行本地c
在android代码中编译一个可执行文件,主要功能是对文件的读写,
简单贴出来:
- #include <errno.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <unistd.h>
- void read_data(void){
- char readBuf[640*1024];
- char *path = "/boot0_nand";
- FILE* fp= fopen(path,"rb");
- if(!fp){
- printf("can't open %s\n",path);
- }
- size_t len = fread(readBuf,sizeof(char),sizeof(readBuf),fp);
- printf("read len = %d \n",(int)len);
- fclose(fp);
- }
- int main(int argc, char** argv) {
- int ret;
- int opt;
- read_data();
- }
起初,是用android的编译环境,定义了android.mk文件如下:
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES := writeBoot/write_boot.c
- LOCAL_MODULE := write_boot
- LOCAL_FORCE_STATIC_EXECUTABLE := true
- LOCAL_MODULE_TAGS := eng
- LOCAL_STATIC_LIBRARIES := libstdc++ libc libcutils
- include $(BUILD_EXECUTABLE)
编译通过,但是执行到fread的时候,就报错了:Segmentation fault
一直搞不明白,那么简单的代码,就报这个错误!
无奈,实在是没办法,就用gcc来编译,方法如下:
- gcc write_boot.c -o write_boot
把write_boot推到小机,修改权限,执行,又报错:not executable: magic 7F45
网上查了一下,通过Android NDK来编译生成,这个比较简单:
编辑一个脚本如下,命名agcc:
- #!/bin/sh
- OS='linux'
- ANDROIDSDK='android-14'
- ANDROID='/home/xiongtie/workspace/A31/android41'
- PROGDIR='/home/xiongtie/workspace/A31/android41/prebuilts/ndk/android-ndk-r7/'
- PROGDIR=`cd $PROGDIR && pwd`
- ARMEABIGCC=$ANDROID/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-gcc
- ARMEABILIB=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/lib
- ARMEABIINC=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/include
- ARMEABICRT=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/lib/crtbegin_dynamic.o
- LINKER=/system/bin/linker
- echo "GCC:"$ARMEABIGCC "LIB:"$ARMEABILIB "LINKER":$LINKER "PARAMS:"$@
- $ARMEABIGCC $@ -Wl,-rpath-link=$ARMEABILIB,-dynamic-linker=$LINKER -L$ARMEABILIB $ARMEABICRT -I$ARMEABIINC -nostdlib -lc
编译名如下:
- ./agcc write_boot.c -o write_boot
再推到小机执行,ok,完成了
Android上运行本地c的更多相关文章
- 编译可在Android上运行的qemu user mode
前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的”NDK”若无特殊说明均指”Android NDK”. 下文中”$NDK ...
- 系列篇|编译可在Android上运行的依赖库(一):glib库
前言 这是系列文章,它们由<编译可在Android上运行的glib库>及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出.由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库 ...
- react native-调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错
调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错,而在iOS上运行没问题.原因是因为接口是有验证信息的,而调用这个插件时没有传入,在iOS上会自动加 ...
- 在Android上运行Java和C程序
在linux上运行java程序,直接用javac编译,再用java启动虚拟机运行就行了.但是在Android上,由于虚拟机和pc端的不同,所以操作方法也是不一样的.下面介绍Android上运行Hell ...
- 在 android 上运行 python 的方法
在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的事情,因为python脚本真是非常高效,另外,有很多非 ...
- Unity3D之AssetBundle学习:Android上运行笔记
路径统一 在Android上加载StreamingAssets文件夹下的AssetBundle文件,首先需要对加载地址进行处理,注意PC.Android和IOS的地址不一致需要针对不同的平台不同的处理 ...
- 在Android 上运行 openCV ,并做灰度变化的一个例子
OpenCVImageProcessing1. 导入Opencv的 androrid SDK灰度算法 OpenCVImageProcessing 导入opencv Jar包,配置OpenCVLibra ...
- 在Android上使用qemu-user运行可执行文件
在Android上使用qemu-user运行可执行文件 作者:寻禹@阿里聚安全 前言 QEMU简要介绍: QEMU可以解释执行可执行程序.既然QEMU可以解释执行可执行程序,那么QEMU就能够知道执行 ...
- 准备开发一个运行在Android上的JavaME模拟器
在一个虚拟机A上运行另外一个虚拟机B看起来是挺不靠谱的一件事,在手机上运行某个虚拟机也不怎么靠谱.并且如果虚拟机A运行在手机上这个听起来就更不靠谱了.但是很多人就在做这样的事.比如在在手机上运行DOS ...
随机推荐
- OpenStack Block Storage安装配置use LVM
1,storage systems use LVM Ins and configuration Block Storage; apt-get install lvm2; 创建Physical volu ...
- java 科学计数法表示转换
BigDecimal strScien = new BigDecimal("9.67953970412123E-05"); System.out.println(strScien. ...
- Linux内核中常见内存分配函数(三)
ioremap void * ioremap (unsigned long offset, unsigned long size) ioremap是一种更直接的内存“分配”方式,使用时直接指定物理起始 ...
- Java List 汉字进行排序
Comparator<Person> cmp = new Comparator<Person>() { public int compare(Person o1, Person ...
- error LNK1104: 无法打开文件“libboost_thread-vc140-mt-gd-1_61.lib”
error LNK1104: 无法打开文件“libboost_thread-vc140-mt-gd-1_61.lib” 调试->你的项目属性 配置属性->VC++目录 包含目录 D:\bo ...
- hdu 1035 Robot Motion(模拟)
Problem Description A robot has been programmed to follow the instructions in its path. Instructions ...
- nyoj 927 The partial sum problem(dfs)
描述 One day,Tom’s girlfriend give him an array A which contains N integers and asked him:Can you choo ...
- OC基础4:类和方法
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.类的声明(@interface)要放在 ...
- 图数据库之Pregel
/* 版权声明:能够随意转载,转载时请务必标明文章原始出处和作者信息 .*/ author: 张俊林 节选自<大数据日知录:架构与算法>十四章.书籍文件夹在此 Pre ...
- java的静态代理
解决这个问题:在多个模块要插入一段功能,比方,在不同业务处理模块中,都须要检查用户是否登录,假设不使用代理的话,每添加一个模块,就须要添加非常多代码. 比方,除了推断是否登录,假设还须要添加一个记录日 ...