什么是ndk?什么是jni?很久很久以前,记得那一天面试官面试我NDK,之前背了好久,当面试一紧张就忘了,尴尬的要命。
技术类的东西现在我都不去特地死记硬背了,原因有二:
1.人家随便问问你就知道你到底真的接触还是没有;
2.技术那么多,每个人有自己的强项,做好自己努力学习就ok。
这几天一个朋友问了我一个问题,app项目自动检测更新在局域网下怎么做,然后聊啊,聊......其实app项目自动检测更新本身没什么难度,只要接触一次基本就OK,没接触那需要简单了解下(看吧,人家也是高级工程师,并不是别人技术不行,每个人接触点不同,聊到ndk,估计我就焉了,因为接触不多)。技术研发主要还是在于思路,其他的都是浮云(让你很蛋碎的浮云),如果你思路都没有,你技术再牛也是废了(技术牛人一般不会没思路,这种人现在我还没发现过)。
言归正传,他的问题难点不在于app自动检测更新,而在于root权限这块,因为他的app是系统级别的,用户不能手动删除这个app,所以需要到底层去获取这个root权限,涉及到调用底层问题(一般底层都是使用c/c++写的,必须使用安卓ndk编写c/c++、java的JNI调用c/c++),虽然这个问题最后还是因为其他原因最终没有得到解决,但是还是激起了我的好奇心。
因为我以前也接触过NDK,但是不多,只是学习了一下下,虽然现在也是抱着学习的态度,可是起点不一样。以前当别人告诉我NDK的时候,内心是崩溃的,还他妈这么多东西要学啊,累死宝宝了。现在无所谓了,债多不压身,而且感觉自己在脑海中就有那么一丝思路,随着进入学习,思路也就更加清晰,这就是所谓的老司机。
以上纯属扯淡,可不看。
一、简介
什么是NDK?
NDK全称为native development kit本地语言(C&C++)开发包。而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持java语言开发)。
简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用。NDK开发的可以称之为底层开发或者jni(java native interface)层开发,SDK开发可以称为上层开发。
Android开发中使用NDK的原因:
1、众所周知,利用SDK编写的代码,生成的APK,很容易就可以反编译了,安全性极为不高,而利用NDK开发的库,不容易被反编译,保密性,安全性都提高了。
2、很多开源工程和大型工程都是C&C++代码,把它们转换为纯java语言显然是不可能的。
3、C&C++的代码运行速度和效率都比java快很多。
什么是JNI?
JNI全称为Java Native Interface(JAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互。并非从Android发布才引入JNI的概念的。
简单来说,Android的NDK提供了一些交叉编译工具链和Android自带的库,这些Android的库可以让开发者在编写本地语言的程序时调用。而NDK提供的交叉编译工具链就对已经编写好的C&C++代码进行编译,生成库。当然了,你也可以自己搭建交叉编译环境,而不用NDK的工具和库。然后生成库,只要规范操作,一样可以生成能让JAVA层成功调用的库文件的。
以上代码直接在网上拷贝过来的,太多了。
简单理解JNI和NDK。NDK,安卓系统是基于linux内核的,他的底层都是使用c/c++编写的,这就是NDK(粗略可这么理解);JNI,我们应用层使用java编写的,调用c/c++,必须使用JNI才可以。
二、NDK环境搭建
我是参考http://www.cnblogs.com/yejiurui/p/3476565.html的,大家有时间可以看看。注意他下面的demo有些小问题,也没有对有的问题进行注解,后面我会根据他的问题和注释说明,但是大体不影响操作,还是一个非常棒的bug,算是史上让我最易懂的NDK资料了。
1.下载ndk,在网上直接搜索ndk即可,最好在http://wear.techbrood.com/tools/sdk/ndk/官网上下载。下载完成之后解压即可。
2.打开Eclipse,新建一个Android工程(我的取名为JNIDemo),在工程目录JNIDemo下新建jni文件夹,该文件夹就用来保存NDK需要编译的文件代码等。
3.开始新建并配置一个Builder
(1)Project->Properties->Builders->New,新建一个Builder。
(2)在弹出的【Choose configuration type】对话框,选择【Program】,点击【OK】:
(3)在弹出的【Edit Configuration】对话框中,配置选项卡【Main】。
在“Name“中输入新builders的名称(这个名字可以任意取)。
在“Location”中输入nkd-build.cmd的路径(这个是下载完ndk10后解压后的路径,这个建议放在根目录下面,路径不能有空格和中文)。根据各自的ndk路径设置,也可以点击“Browser File System…”来选取这个路径。
在“Working Diretcoty”中输入TestNdk位置(也可以点击“Browse Workspace”来选取TestNdk目录)。
勾选“Refresh resources upon completion”,
勾选“The entire workspace”,
勾选“Recuresively include sub-folders”。
(5)继续在【Edit Configuration】对话框中,配置选项卡【Build options】。
勾选“After a “Clean””,(勾选这个操作后,如果你想编译ndk的时候,只需要clean一下项目 就开始交叉编译)
勾选“During manual builds”,
勾选“During auto builds”,
勾选“Specify working set of relevant resources”。
点击“Specify Resources…”勾选JNIDemo工程中新建的“jni“目录,点击”finish“。 点击“OK“,完成配置。
到此,恭喜你,编译环境以及成功搭建完毕!
再此留下QQ:1105107264 !方便美女交流,帅锅吐槽。