EClipse开发NDK流程(现在studio也在2.2之后支持了非常简单,只要创建项目的时候勾选c++支持就可以了)
什么情况下使用ndk,1.保护代码,java很容易反编译,c/c++反汇编比较难,2.调用底层代码,比如人脸识别3.便于移植,适合更多的嵌入式平台再次使用
交叉编译:是在一个平台生成另一个平台可执行的代码(平台的指令集不一样,比如电脑x86,手机arm,他们的系统执行使用不一样的),
jni是什么 java Native Interface 的缩写,jni是标准成为java平台的一部分,它允许java和其他语言混合开发进行交换
ndk 开发流程
1.下载ndk的工具,(比如r9d),下载完成后解压,
2.配置ndk 的开发环境,
我们先使用命令行执行ndk-build会得到(命令执行完之后不是该命令不是内部或外部命令)
这时候开始配置开发环境配置完成之后在执行ndk-build会得到(命令执行完之后不是该命令不是内部或外部命令),
原因是系统环境变了,但是命令行还在刚才配置前的环境,只要新开一个窗口在执行就ok了(一般会是could not find application.........)
这样就完成了,could not 原因是,这个命令需要在一个安卓项目下执行才有效
3.配置eclipseADT插件 点击Help-install New software... 点击add,选择location的Archive选择ADT的路径 ,
选择完成后下边有个列表,需要全选,最重要的是Android Native Development Tools 一定你要选
然后点击next,选择I accept the......选项(我同意的选项) 然后finish重启eclipse就行了
到此为止安装完毕
4.接下来导入一些简单的demo
在r9d下有个samples是一些简单的ndk代码
接下来import(最好copy一份到工作空间,不要动原来的项目)后
5.进入该项目的文件夹下,再执行ndk-build,执行完成后,刷新eclipse中的项目,
此刻会多了一个object的文件夹里面包含了arm架构的.so包,以及其他的包括x86架构的
6.
(运行到模拟器)最好安装一个arm的兼容包(电脑是x86,手机是arm架构)
如果我们不需要这么多架构的包,可以在jni的application.mk的文件中通过#注释掉APP_ABI:=all
然后再通过命令执行ndk-build clean ,清除掉之前编译生成的.so文件,刷新项目,
你会发现,object下的架构少了,此时你再删除object文件夹,重新执行ndk-build,刷新eclipse项目,
然后就只剩一个arm架构的.so了
-------------------------------------------------------------------- 华 丽 的 分 割 线--------------------------------------------------------------------
开发自己的第一个ndk项目流程
第一步创建项目,
第二步项目下创建jni目录
第三步编写nativejava层代码(这里只有方法,没有方法体,因为调用的是)
第四步通过javah命令生成jni头文件(生成完毕后刷新项目,.h文件就出来了)
这里要说明下.h文件的作用,这里的作用是用来声明跟本地语言交互平台,
进行Java与C/C++交叉编译的工具的平台,这个文件不是必须的,但是行业规范是必须要写的,应为这样容易查找,
第五步开发c
第六 步生成so库
第七步加载so库使用
1.创建项目(不解释)
2.创建jni目录
创建一个jni目录(项目的根目录下)
3.声明本地方
在mainactivity类中,声明一个方法
public static native String getStringFromC();
注意:这里的一定要写的两个关键字是 native ,以及static,
其中native 毋庸置疑,就是声明该方法是个调用本地的语言的方法,
static目的是加载该类的时候就直接加载该方法,其中如果不写这个static
将会导致.h文件中没有该方法的签名(也就是.h文件没有改方法的声明的签名平台这个签名是有规则的)
例如:JNIEXPORT void JNICALL Java_com_example_myjni_MainActivity_callMyC(JNIEnv *, jclass);不写static将没有这个
4.生成头文件
然后生成头文件,使用命令javah命令得到一个帮助使用方式,
//路径 //输出路径 包名.类名
进入到项目的目录,使用javah -classpath bin/classes -d jni com.example.hellon.mainactivity
这样会报错, 无法访问Android.app.Activity.......
原因:它不知道activity在哪
解决方式:javah -classpath bin/classes; 任意sdk的android.jar路径 -d jni com.example.hellon.mainactivity
然后回车,刷新eclipsejni文件夹多了一个.h结尾的文件,接下来就可以在jni下创建c的文件开发c层(开发c层自行再找)
5.c层开发.....
创建你的.c文件,include 一些c需要使用的.h文件,以及你自己生成的.h文件
(这里eclipse不支持智能提示,你可以百度配置方法的支持自行配置,即便你配置好了对c的支持不太友好,c++则更好些)
语法问题自行找教程
6.生成so库
准备成so库
6.1(关于配置文件)
Android.mk文件,他是配置你那些文件需要生成so库以及so库名称的,这个文件直接拷贝一份改改就行了,其中,LOCAL_MOUDLE :=你想生成.so文件的名字
LOCAL_SRC_FILES :=你要编译的c文件.c
接下来编译如同上边,编译完成后,刷新,多了.so文件就可以引用了,
Application.mk文件主要是编译那种平台的.so文件,这个文件直接拷贝一份改改就行了 ,
其中APP_ABI是配置平台的,all代表所有,你也可以指定平台架构,这里可以去读r9d中的doc文档中,Application.mk一篇
(这里我们生成so库后,.c文件无法直接影响我们的程序,
java调用so,而so是.c衍生出来的的,
当我们确定好so以后,c基本就丧失了作用,
这里千万不要因为没有了删除,因为你可能以后还要对c文件修改等 拓展,所以文件要留存)
6.2 (ndk -bulid )
在项目目录下使用该命令
生成so库后,一定要确保libs下有一份(一般来讲命令生成以后,会自动在项目下的lib中有一份,以及obj下local中也有一份)
7.
最后加载so库
在mainactivity引用的时写个静态代码块static{ System.loadLibrary("你想要加载生成的so文件")}
结尾:
关于javah命令有没有便捷方式问题,这个的确手写非常累赘,我们可以配置eclipse的配置,详情配置请自行搜索配置方案
还有就是
-
SBT 构建scala eclipse开发
scala eclipse sbt 应用程序开发 搭建Eclipse开发Scala应用程序的一般步骤 一.环境准备: 1.Scala : http://www.scala-lang.org/ 2.Sc ...
-
专2-第二课 Eclipse开发环境搭建
2.1下载Eclipse 2.2 安装C/C++版本的Eclipse 2.3 安装JDT插件开发Java程序 2.4 使用Eclipse开发驱动程序 既然安装了eclipse来进行驱动学习,那么我们就 ...
-
在IDEA上跑eclipse开发的J2EE项目
Context MacOS 10.12.1 IDEA ULTIMATE 2016.2 项目使用eclipse开发 项目使用SVN进修版本管理 核心步骤 检出项目,完成基本配置 从svn检出 当项目下载 ...
-
eclipse开发servlet,HttpServletRequest报红叉解决方案
eclipse开发servlet,HttpServletRequest报红叉解决方案 今天突然间有兴致,想打一会代码,于是开发一个Servlet,代码和配置路径都没问题,HttpServlet居然报错 ...
-
Linux上搭建Hadoop2.6.3集群以及WIN7通过Eclipse开发MapReduce的demo
近期为了分析国内航空旅游业常见安全漏洞,想到了用大数据来分析,其实数据也不大,只是生产项目没有使用Hadoop,因此这里实际使用一次. 先看一下通过hadoop分析后的结果吧,最终通过hadoop分析 ...
-
突破瓶颈,对比学习:Eclipse开发环境与VS开发环境的调试对比
曾经看了不少Java和Android的相关知识,不过光看不练易失忆,所以,还是写点文字,除了加强下记忆,也证明我曾经学过~~~ 突破瓶颈,对比学习: 学习一门语言,开发环境很重,对于VS的方形线条开发 ...
-
Linux下使用Eclipse开发Hadoop应用程序
在前面一篇文章中介绍了如果在完全分布式的环境下搭建Hadoop0.20.2,现在就再利用这个环境完成开发. 首先用hadoop这个用户登录linux系统(hadoop用户在前面一篇文章中创建的),然后 ...
-
zookeeper Eclipse 开发环境搭建及简单示例
一,下载Zookeeper安装包 从官方网站下载稳定版安装包后,解压. 其中ZK_HOME 为:D:\Program Files\zookeeper-3.4.9 二,启动Zookeeper Serve ...
-
使用eclipse开发的兼容性配置
通常使用eclipse开发程序的时候,正常情况下放到Linux中运行一般是没有什么问题,最明显的就是编码问题,这个一般都会统一为utf-8,另外还有Windows和Linux的换行符不同的原因,还有当 ...
随机推荐
-
Cesium原理篇:Batch
通过之前的Material和Entity介绍,不知道你有没有发现,当我们需要添加一个rectangle时,有两种方式可供选择,我们可以直接添加到Scene的PrimitiveCollection,也可 ...
-
ShellExecute 使用方法
ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件.打开一个目录.打印一个文件等等),并对外部程序有一定的控制. 有几个API函数都可以实现这些功能,但是在大多数情况下She ...
-
jquery去掉或者替换字符,设置指定options为selected状态
<html> <body> <div><select id="queryYear"> <opt ...
-
Struts2中过滤器和拦截器的区别
拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而 ...
-
Java编程性能优化
1尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资 ...
-
python读取文件通过正则过滤需要信息然后保存到新文件里
import osimport reimport fileinput def getDataFromFile(): rt = "/(.*)/(.*).apk" ...
-
linux svn安装和配置
linux svn安装和配置,不结合apache http://blog.51yip.com/server/901.html 张映 发表于 2010-07-07 分类目录: 服务器相关 今天有个同事在 ...
-
.net 加密错误:填充无效,无法移除
今天用System.Security.Cryptography加密.使用了AesManaged,报错:填充无效,无法移除.分析是解密失败,密文损坏,或者KEY,IV不正确. using (AesMan ...
-
hdu 4598 Difference(奇圈判定+差分约束)
这是通化邀请赛的题,当时比赛的时候还完全没想法呢,看来这几个月的训练还是有效果的... 题意要求(1) |ai| < T for all i (2) (vi, vj) in E <=& ...
-
webpack 的使用1
进入指定文件夹 npm init 安装 npm install webapck --save-dev 根目录下新建hello.js 将文件打包到指定文件 Asset :打包成的文件名称 Chunk ...