EClipse开发NDK流程

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的配置,详情配置请自行搜索配置方案
还有就是
相关文章
相关标签/搜索