android 编译调用C代码
博客地址:www.zalezone.cn
前言
需求来源
这几天帮别人做一个简单的androidclient,也没什么功能,主要就是调用C代码来对手机的Wifi网络进行设置。于是也就引出了技术难点所在,怎样去调用C程序达到我们所须要的效果。
解决方式
对于这个,我想出了两种解决方式:
第一种方案是利用
fr=aladdin" target="_blank" rel="external">JNI
来进行本地调用。关于什么是JNI呢,JNI事实上是Java Native Interface的简称,也就是java本地接口,它提供了若干API实现了java和其它语言的通信(主要是C和C++)。另外一种方法是将要运行的C代码编译成可运行文件,然后将这个可运行文件和程序一起打包成APK,在须要使用的时候调用这个可运行文件。
终于选择
最后我选择了另外一种方案,理由是另外一种方法在我已经有了可运行文件的条件下整体来说比較简单。可操作性强。
而第一种方案的话由于还要下载android的NDK,NDK是一系列工具的集合,提供了帮助开发人员高速开发C或则C++的动态库。并能自己主动将so和java应用一起打包成apk。十分方便。
技术实现
可运行文件
首先须要得到一个可运行文件。当然想要的到可运行文件并非想象中的那么简单。不是在linux中直接gcc就能到的,这里须要对C代码进行 fr=aladdin" target="_blank" rel="external">交叉编译
资源存储
这里的资源存储页算是个小坑,寻常我们在写java程序的时候,假设要打开一个文件的话就直接输入路径,比方假设所要使用的文件就在项目的文件夹下,直接输入文件名称就能够调用了,可是这里的执行环境是嵌入式设备,不是PC,这就涉及到一个问题。资源怎样存储了。
这里先谈一下Android中的asset目录和res/raw目录的异同:
- 同样点
- 两者文件夹下的文件在打包后都会原封不动的保存在apk包中。不会被编译成二进制。
- 不同点
- res/raw中的文件会被映射到R.java中,訪问的时候直接使用资源ID就可以。而assets文件夹下的文件不会被映射到R.java。
- res/raw不能够有文件夹结构,而assets文件夹下能够再建立文件夹。
资源获取
这里顺带说一下res/raw下的文件资源的读取方法,通过下面方式获取输入流来进行写操作
|
|
接下来才是我用到的读取assets下的方法,相同也是通过获取输入流的方式来进行写操作
|
|
注意点:据说Assert仅仅能放单个文件不超过1M的文件,可是不是真的详细还没考证过,假设碰到问题了应该考虑一下这个注意点。
尽管读取是成功了。可是要用shell脚本运行的话。应该在手机的存储上应该有这个文件,光是读取的话在手机里面是找不见的,所以我们须要一个存文件的操作。
这里我写了一个存文件的函数,当中将获取assets中数据的方法也结合进去了。
|
|
然后我定义的传入的outFileName是定义的文件路径加文件名称
|
|
shell命令运行
到这里的话就是“万事俱备,仅仅欠东风”了,我们须要运行所得到的可运行文件,由于android是基于linux的,所以一些主要的命令还是支持的。在android中要运行shell命令的话就按例如以下格式就可以:
|
|
android 编译调用C代码的更多相关文章
- 【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在And ...
- android112 c代码打印日志,c反编译调用java
activity: package com.itheima.ccalljava; import android.os.Bundle; import android.app.Activity; impo ...
- [转][android][利用JNI技术在Android中调用、调试C++代码]
在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在Android中会生成Linux系统下的.so文件(好吧,其实我基本没用过Linux). 没写过 ...
- Ubuntu系统下实现Android工程调用独立编译的C++程序和GMP、PBC库
目的: 实现使用C++编写代码供Android工程调用.C++代码中可以使用STL库,也可以使用常用的由源码编译生成的库,如PBC.因为PBC是基于GMP库的,所以这里只记录了GMP和PBC库的编译安 ...
- Android开发:APK的反编译(获取代码和资源文件)
一.反编译工具: 1.APKTool: APKTool是由GOOGLE提供的APK编译工具,能够完成反编译及回编译apk的工作.同时,它也有着安装反编译系统apk所需要的framework-res框架 ...
- android开发中调用python代码(带参数)
android开发主要用到的是java代码,但是当开发涉及到一些算法时,往往用python可以提高软件的运行速度,也更加便捷,这里分享自己项目调用python代码的方式,主要有以下几个步骤(个人方法, ...
- 如何使用g++编译调用dll的c++代码
本文将有以下4个部分来讲如何使用g++编译调用dll的c++代码. 1.如何调用dll 2.动态链接和静态链接的区别 3.g++的编译参数以及如何编译调用dll的c++代码 4.总结 1.如何调用dl ...
- apt 根据注解,编译时生成代码
apt: @Retention后面的值,设置的为CLASS,说明就是编译时动态处理的.一般这类注解会在编译的时候,根据注解标识,动态生成一些类或者生成一些xml都可以,在运行时期,这类注解是没有的~~ ...
- android JNI调用(转)
Android jni开发资料--NDK环境搭建 android开发人员注意了 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwi ...
随机推荐
- “HTTP 错误 401.1 - 未授权:登录失败” iis配置和权限问题
今天,将项目发布到IIS服务器上,出现此问题,本地IIS访问正常. 登录失败说明根本登录不了,谈何访问网页,所以要从两方面下手,一.账户:二.账户权限: 一.设置你网站属性的时候,目录安全性-匿名访问 ...
- ios block循环引用问题
ios开发中,开了ARC模式,系统自动管理内存,如果程序中用到了block就要注意循环引用带来的内存泄露问题了 这几天遇到一个问题,正常页面dismiss的时候是要调用dealloc方法的,但是我的程 ...
- C++智能指针--weak_ptr
weak_ptr是对对象的一种弱引用,它不会添加对象的引用计数.weak_ptr和shared_ptr之间能够相互转换.shared_ptr能够直接赋值给week_ptr,week_ptr可通过调用l ...
- 【总结】在VirtualBox上面安装Mac的注意事项
看此文之前 http://www.crifan.com/category/work_and_job/virtual_machine/virtualbox-virtual_machine/ 此文仅仅是针 ...
- UpdataData
MFC中有一个UpdataData函数,有二个参数:TRUE和FLASE,二个参数什么时候用, 开始的时候我也迷糊,后来才发现: UpdataData(TRUE):是把控件上的值刷新到变量中: Upd ...
- Oracle的dbms_output包的put()和put_line()的区别只是有没有回车换行吗?(转)
答案是否 除了自动添加回车换行外,还有就是缓冲区最大容量的问题!! 无论如何设置serveroutput size,10g里 put() 最多只能输出 32767 个byte 而 put_line() ...
- SQL SERVER CHARINDEX函数
CHARINDEX函数经常常使用来在一段字符中搜索字符或者字符串.假设被搜索的字符中包括有要搜索的字符,那么这个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的開始位数.即CHARIN ...
- JavaScript 中的事件对象(读书笔记思维导图)
在触发 DOM 上的某个事件时,会产生一个事件对象 event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对象中,会包含 ...
- nginx做下载限速
nginx做下载限速-szszszsz-ChinaUnix博客 nginx做下载限速 2009-12-25 14:34:57 分类: 系统运维 nginx做下载服务器,在性能上满足需求.自带limit ...
- CV和Resume的区别(转)
常常有人把CV和Resume混起来称为“简历”,其实精确而言,CV应该是“履历”,Resume才是简历.Resume概述了有关的教育准备和经历,是对经验技能的摘要:curriculum vitae则集 ...