一、什么是NDK?

NDK是Android让你潜入原生组件(C/C++开发)的一套开发套件

Android应用程序是运行在Dalvik虚拟机中的 ,NDK允许你通过原生代码实现部分的应用程序模块 。

二、为何要用NDK?

我们猜想一下:

1,需要重用你以前C/C++写好的模块

2,速度的需要

3,个别功能实现的需要,比如你要用到原生类库才能实现的一些功能

好处和坏处:

使用本地代码不一定能提高性能, 但是一定会增加程序的复杂性.

NDK适合用来做的事情一般是自包含的, CPU密集型的不需要大量内存的操作 -- 例如信号处理, 物理模拟等等.

简单的将一个方法使用C重写一般不会达到性能的提升. 不过, NDK可以是一种重用大量已有C/C++代码的不错的方法.

三、Java JNI应用详解

3.1>分析总结JNI步骤

(1) 编写Java类,并定义native方法

(2) 使用Javah生成.h文件

(3) 建立C/C++动态链接库工程,并实现.h文件的接口

(4) 生成.so/dll文件并放到适当位置

(5) 启动Java程序

3.2>怎么理解JNI

JNI即是Java Native Interface, 通过JNI代码实现Java与Native代码的连接。

四、NDK应用实例

4.1>运行和发布模式是什么样的?

C/C++的原生代码任然是运行在虚拟机的;

.so文件是打包在apk文件里面的;

4.2>NDK特性

【稳定的API】

NDK提供了一组稳定本地API的系统头文件,

这些头文件被保证在以后发布的平台中被支持:

libc (C 库) 头文件

libm (数学库) 头文件

JNI 接口头文件

libz (Zlib 压缩) 头文件

liblog (Android 日志) 头文件

OpenGL ES 1.1 (3D 图形库)

头文件

一组最小的支持C++的头文件

【提供了生成原生代码类库的工具】

NDK提供了一个构建系统来使你能够有效的编译你的源代码,

而不需要处理工具链/平台/CPU/ABI的细节.

你只需创建一些简短的文件来描述你希望编译的文件,

以及android应用程序需要用到的文件

--

构建系统将编译这些源文件并将这些共享库放在你的应用程序工程中.

【提供了原生类库与Android App继承的一条途径】

【NDK与JNI的关系】

4.3>Case: 编写纯Native的代码

【配置编译环境】

"F:\Tools\Programming\SDK\android-ndk-r7b\" 是NDK的安装目录

[Cross Settings]

Prefex: arm-linux-androideabi-

Path: F:\Tools\Programming\SDK\android-ndk-r7b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows

[Cross GCC Compiler]

Include Paths:

F:\Tools\Programming\SDK\android-ndk-r7b\platforms\android-9\arch-arm\usr\include\

F:\Tools\Programming\SDK\android-ndk-r7b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\include\

F:\Tools\Programming\SDK\android-ndk-r7b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.4.3\include

F:\Tools\Programming\SDK\android-ndk-r7b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.4.3\include-fixed\

F:\Tools\Programming\SDK\android-ndk-r7b\sources\cxx-stl\stlport\stlport\

Miscellaneous:

Other Flags :-c -fmessage-length=0 -DANDROID -fno-exceptions

(如果使用stlport,“-DANDROID -fno-exceptions” 选项是必须的否则 stlport中的 #include_next 没法使用)

[Cross G++ Compiler] 同上

[Cross G++ Linker]

General: -nostdlib

Libraries:

c

m

stdc++

stlport (若要需添加,需从设备上取得/system/lib/libstlport.so文件并放到lib包含目录)

库路径:

F:\Tools\Programming\SDK\android-ndk-r7b\platforms\android-9\arch-arm\usr\lib

Miscellaneous:

其它选项:

-RF:\Tools\Programming\SDK\android-ndk-r7b\platforms\android-9\arch-arm\usr\lib

其它对象:

F:\Tools\Programming\SDK\android-ndk-r7b\platforms\android-9\arch-arm\usr\lib\crtbegin_dynamic.o

F:\Tools\Programming\SDK\android-ndk-r7b\platforms\android-9\arch-arm\usr\lib\crtend_android.o

【发布程序】

【建立调试环境】

使用GDB调试 ,在Eclipse中调试。

4.4>Case: NDK的Helloworld

建立工程;

编译.so文件;

运行工程文件;

调试Native代码;

(1)为Android工程添加Native支持.

(2)配置调试环境。

15、NDK开发初步的更多相关文章

  1. Android NDK开发初步

    在配置好NDK开发之后就能够使用C/C++开发android了.以下以一个HelloWorld项目来说明 1.新建一个Androidproject 新建一个HelloWorldproject 代码例如 ...

  2. Android NDK开发及OpenCV初步学习笔记

    https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...

  3. Android NDK开发初识

    神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...

  4. NDK开发-Android Studio+gradle-experimental开发ndk

    在最新的Android Studio2.2的preview版中,增加全新的ndk支持,使用了新的gradle,以及DSL语言. 新的NDK需要使用新的Gradle插件和新的Android插件来支持! ...

  5. android ndk开发(二)实现一个官方demo

    实现了一个官方的demo:bitmap-plasma(水波纹) 源代码就在samples文件夹下,可以自己去找. 界面: 建立项目的步骤和配置环境不明白的可以去看:http://www.cnblogs ...

  6. !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结

    http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-opencv-development-3/ Android Ndk a ...

  7. JNI/NDK开发指南(开山篇)

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术, ...

  8. android studio下的NDK开发详解(一)

    源地址:http://www.voidcn.com/blog/chengkaizone/article/p-5761016.html 好记性不如烂笔头,开始坚持写博客,学一点记一点,只为了生活更好. ...

  9. 简单的调用OpenCV库的Android NDK开发 工具Android Studio

    前言 本博客写于2017/08/11, 博主非专业搞安卓开发, 只是工作的需要倒腾了下Android NDK相关的开发, 博文中有什么不正确.不严格的地方欢迎指正哈    本文后续也许还会有删改, 就 ...

随机推荐

  1. 制作输入框(Input)

    怎样判断是否应当使用输入框 输入框,就是用户可以自由输入文本的地方.当需要判断是否需要使用输入框时,可以遵循一条原则:凡是需要用户自主输入文本的地方,几乎都必须使用输入框. 输入框的常见用法:输入登录 ...

  2. 如何在JavaScript里防止事件函数的高频触发和调用

    网页中JavaScript最基本的功能是监听或响应用户的动作,这非常的有用.用户的动作有些频率非常高,有的十分罕见.有些监听器函数的执行如闪电般完成,而有些繁重的会把浏览器拖死.拿浏览器窗口的resi ...

  3. LocalStorage 本地存储

    首先自然是检测浏览器是否支持本地存储.在HTML5中,本地存储是一个window的属性,包括localStorage和sessionStorage,从名字应该可以很清楚的辨认二者的区别,前者是一直存在 ...

  4. 【图说】Eclipse与Unity 3D协同工作

    原地址:http://blog.csdn.net/h570768995/article/details/9355313 Eclipse开发过程中总会碰到很多的难题,如何利用好工具帮助我们更快捷的开发也 ...

  5. xcode 树形管理 cocos2d-x的资源

    把资源以目录的形式加入xcode中, 同时, 在加入时, 选择"Create Folder References for any  added folders", 而不是默认的&q ...

  6. Source Insight的应用技巧、宏功能

    目录 1 简介... 5 2 搭建我们的SI环境... 5 2.1 搭建步骤... 5 2.2 说明... 6 3 应用技巧... 6 3.1 初级应用技巧... 6 3.1.1 解决字体不等宽与对齐 ...

  7. (转)CSS+DIV float 定位

    来自:http://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html 很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能 ...

  8. 统计 p-value 含义

    p-value是一种概率:在原假设为真的前提下,出现该样本或比该样本更极端的结果的概率之和. 例子: 我们假设 H0:出现正面的概率是1/2 扔硬币20次出现了14次正面.该样本的单边p-value计 ...

  9. Memcache+Cookie解决分布式系统共享登录状态------------------------------Why Memcached?

    每个用户请求向IIS发送一个请求,但IIS服务器的请求数有限,cpu支持的线程数有限,如果一秒钟向这台服务器发送10000次,那么则一般就会有问题,考虑集群, 请求数据分流,几台服务器共同对应一个公共 ...

  10. 通过 PHP 判断用户的设备是否是移动设备

    <?php function isMobile() { // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 if (isset ($_SERVER['HTTP_X_WAP_PROF ...