怎样将runlmbench 获取的数值传给上层app
前面那个随笔 , 已经成功将runlmbench 移植到了Android , 并成功的运行。
今天就写一下将runlmbench 获取的那些性能值传给上层 App 进行人机交互。
一开始 , 我是想直接将runlmbench 的源代码添加到jni 直接给上层App 使用 , 但是发现有些很重要的函数不能使用 , 比如 signal 函数。
然后 , 移植源代码的方式行不通 , 我就想选择利用exec的方法 去运行runmbench 的命令 ,但是,昨天那个随笔就是发现了这个方法的不足 。
它只能返回0 ~ 255 的值 , 而内存的测试那一块速度是不止 255MB/S 的 , 而且 , 通过Linux 提供的缓冲区的功能 , 大文件的读写速度
也有可能超过300MB/s , 所以, 这个方法也不是很行。后来 , 我想通过进程间通信的方法 , 但是发现做起来很麻烦,修改的runmbench
源代码太多 , 效率不高 , 最后 , 选择一个指定的文件 , 让runlmben获取的数据写到那个文件 , 每次覆盖的写 ,然后我的上层jni 代码
用system 函数去执行runlmben 的命令 , 然后去读那个指定文件的数据 ,这样 , 就成功的将文件系统层的命令获取的数据传到上层App ,
这里面做了很多投机取巧的部分 , 但是这是我目前所能找到的最高效最简洁的方法。而且这里面还涉及到一些文件权限问题 , 下面就讲一下
我是怎么解决这些问题的.
第一步 , 修改runlmbench 源代码 , 让它将数据写到某个特定的文件中 , 我指定的文件是 /data/local/bw_file.txt
我是针对bw_file_rd 命令进行的一个修改:有下面几个改动:
1. 在 lib_timing.c 文件中:
把函数bandwidth 函数改为有返回值:
double bandwidth(uint64 bytes, uint64 times, int verbose)
返回double 型,当然这里还要在头文件中进行修改。
在最后面 , 将速度返回出来:
return mb/secs ;
2. 在bw_file_rd.c 文件中 , 在main函数最后 ,加上这几句代码:
speed = bandwidth(count, get_n() * parallel, );
printf("speed : %lf\n" , speed) ;
fd = open(save_file , O_RDWR | O_TRUNC | O_CREAT , ) ;
if (fd == -)
{
perror("oepn failed") ;
}
val = write(fd , (char *)&speed , sizeof(double)) ;
close(fd) ;
speed 是一个double 型, char *save_file = "/data/local/bw_file.txt" ;
最后 ,重新编译把命令写到文件系统内。
第二步 , 添加开机启动shell 命令 , 因为是在上层要去调用文件系统层的命令 , 所以,我们要在开机启动的时候做两个事情,创建两个文件,给这两个文件进行加权限
参考http://blog.csdn.net/dashon2011/article/details/18663743
其实我是用了以前剑锋在Android 编译环境下添加的开机启动脚本里面加了一些东西
首先 , 添加开机启动文件: myandroid/device/fsl/imx6/etc/init.rc
在这个文件内 , 加了这么一段话: 这句话大概在712行
# zengjf -- add for ublox
# Prepare u-blox RIL repository
service uril-repo /system/bin/uril-repo.sh
class main
user root
group radio
oneshot
然后 , 找到文件/system/bin/uril-repo.sh
在适当的位置加上一句话:
#change by chen - -- - touch /data/file.tmp
chmod /data/file.tmp
touch /data/local/bw_file.txt
chmod /data/local/bw_file.txt
dd if=/dev/zero of=/data/file.tmp bs= count=
创建两个文件 , 并对bw_file.txt 进行0赋值。
重做文件系统 ,开机 ,就有那两个文件以及runlmbench 的一系列的命令。
下面是第三步 , 在jni层写代码
代码不多 , 也就几句话:
#include "bw_surface.h" #define BUFF_LEN 512 double bw_surface(char *argv1 , char *argv2)
{
int fd, readlen ;
double buffer ;
int retval ; char command[BUFF_LEN] = "bw_file_rd";
char *willrd_file = "/data/local/bw_file.txt";
char *tmp_file = "/data/file.tmp"; strcat(command, " ");
strcat(command, argv1);
strcat(command, " ");
strcat(command, argv2);
strcat(command, " ");
strcat(command, tmp_file); retval = system(command) ;
if (retval == -)
{
return - ;
} fd = open(willrd_file , O_RDWR);
if (fd == -)
{
return - ;
} readlen = read(fd , (char *)&buffer , sizeof(double)) ;
if (readlen < )
{
close(fd) ;
return - ;
} close(fd) ; return buffer ;
}
返回值为一个double ,为emmc 每秒的带宽 , 其实这也有系统缓冲区的作用 , 这只能是测一个大概的值。
怎样将runlmbench 获取的数值传给上层app的更多相关文章
- TextView 获取行数,某一行的内容,某行的宽度
获取行数 ViewTreeObserver vto = textView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlob ...
- springMVC --@RequestParam注解(后台控制器获取參数)
在SpringMVC后台控制层获取參数的方式主要有两种,一种是request.getParameter("name"),第二种是用注解@RequestParam直接获取. 1.获取 ...
- 【转载】C#通过Rows.Count属性获取总行数
在C#中的Datatable数据变量的操作过程中,有时候我们需要知道DataTable中是否含有数据行或者DataTable的数据总行数,此时我们就可以先拿到DataTable中的Rows属性对象,通 ...
- MFC LIST 获取行数和列数
DWORD dwStyle = dataListControl.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与 ...
- 原生JS操作object HTMLTableSectionElement 对象,获取行数
html页面 <tbody id="infoTab"> <tr class="fomat"> <td class="bl ...
- [获取行数]php读取大文件提供性能的方法,PHP的stream_get_line函数读取大文件获取文件的行数的方...
背景: 下面是获取文件的行数的方法: 一个文件如果知道有几行的话,就可以控制获取一定的行数的数据,然后放入数据库.这样不管的读取大文件的性能,还是写入数据库的性能,都能得到很大的提高了. 下面是获取文 ...
- 原生JS操作 table object HTMLTableSectionElement 对象,获取行数
<tbody id="infoTab"> <tr class="fomat"> <td class="blank&quo ...
- struts2中action手动获取參数
struts2中action手动获取Session,jsp页面參数 1. ActionContext 在Struts2开发中,除了将请求參数自己主动设置到Action的字段中,我们往往也须要在Acti ...
- gmap 获取瓦片数
在 gmap1.7版本中 gMapControl1.MapProvider.Projection.GetAreaTileCount(area, i, 0); 可用来获取到erea里i层的瓦片数量. 但 ...
随机推荐
- Java 并发编程之volatile关键字解析
摘录 1. 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执 ...
- 第7章 jQuery插件的使用和写法
第7章 jQuery插件的使用和写法 插件又称扩展,是一种遵循一定规范的应用程序接口写出来的程序. 插件的编写思想基于面向对象. 获取最新的插件可以查看jquery官网:http://plugins. ...
- input的onkeyup效果 超级简短代码
效果代码 title="请输入正确的十六位数字" onkeyup="javascript: return this.value = this.value.toUpperC ...
- 数据库操作事务IsolationLevel 枚举
成员名称 说明 Chaos 无法覆盖隔离级别更高的事务中的挂起的更改. ReadCommitted 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复 ...
- C# 向IQueryable添加一个Include扩展方法
using System; using System.Data.Objects; using System.Linq; namespace OutOfMemory.Codes { /// <su ...
- centos 7.0 nginx 1.7.9 安装过程
系统用的是centos 7.0最小化安装 我现在安装完了 写一下步骤 还没完全搞懂 首先安装GCC [root@localhost ~]# yum install -y gcc gcc-c++ 已加载 ...
- 查找“CDN、负载均衡、反向代理”等大型网络真实IP地址的方法
首先,CDN.负载均衡.反向代理还分为很多层,有时查出来的是最外层的 CDN 服务器群,真实的机器是不对外开放的,类似这样的: 用户 → CDN 网络 → 一台或多台真实机器 ↗ CDN Server ...
- IIS站点无法访问..点浏览IIS窗口直接关掉
呃..其实这个问题很简单.. 大家可以先看这位大婶写的博文.. http://blog.csdn.net/chenguang79/article/details/7220232 如果网站一访问IIS就 ...
- 浅谈T-SQL中的派生表和CTE
引言 表表达式是一种命名的查询表达式,代表一个有效的关系表.MSSQL支持4种类型的表表达式,它们分别是:派生表.公用表表达式(CTE).视图以及内联表值函数.表表达式并不是物理上真实存在的对象,它们 ...
- java中InvocationHandler 用于实现代理。
以下的内容部分参考了网络上的内容,在此对原作者表示感谢! Java中动态代理的实现,关键就是这两个东西:Proxy.InvocationHandler,下面从InvocationHandler接口中的 ...