一、什么是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. 【BZOJ 3171】 [Tjoi2013]循环格

    Description 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位置(r,c) ,你可以沿着箭头防线在格 ...

  2. Telerik 控件事例(鼠标拖动行,拖动列,设置行对齐,行宽,是否显示)

    People.cs using System;using System.Collections.Generic;using System.Data;using System.Linq;using Sy ...

  3. xcode 上 crash 调试的三种方法

    最近有新人问crash调试方法,简介记录如下: 模拟器调试 打开控制台查看输出日志 显示出错的行数 显示出错的函数iOS Crash跟踪 真机调试 首先修改真机调试的 bundle ID,使代码可以进 ...

  4. this.Invoke和this.BeginInvoke的区别

    private void button1_Click(object sender, EventArgs e) { "; this.Invoke(new EventHandler(delega ...

  5. Why are very few schools involved in deep learning research? Why are they still hooked on to Bayesian methods?

    Why are very few schools involved in deep learning research? Why are they still hooked on to Bayesia ...

  6. TIANKENG’s restaurant

    Problem B:http://codeforces.com/contest/616/problem/B B. Dinner with Emma 题意:一对夫妻要去餐厅吃晚饭,Emma 想去最豪华( ...

  7. cf 357C

    比赛的时候纯暴力超时了  看了别人的代码  set容器类做的   stl里还是有很多好东西的 /**************************************************** ...

  8. shuffle过程中的信息传递

    依据Spark1.4版 Spark中的shuffle大概是这么个过程:map端把map输出写成本地文件,reduce端去读取这些文件,然后执行reduce操作. 那么,问题来了: reducer是怎么 ...

  9. struts2 标签库 介绍

    struts2.0里的标签没有分类,只用在jsp头文件加上<%@ taglib prefix="s" uri="/struts-tags" %>就能 ...

  10. ORACLE 更新关联多张表

    UPDATE T_XMLC_BILL_HEAD_BAK T1 SET (T1.SENDRECEIVEFLAG, T1.SENDRECEIVEOPERATOR, T1.SENDRECEIVEDATE, ...