15、NDK开发初步
一、什么是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开发初步的更多相关文章
- Android NDK开发初步
在配置好NDK开发之后就能够使用C/C++开发android了.以下以一个HelloWorld项目来说明 1.新建一个Androidproject 新建一个HelloWorldproject 代码例如 ...
- Android NDK开发及OpenCV初步学习笔记
https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...
- Android NDK开发初识
神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...
- NDK开发-Android Studio+gradle-experimental开发ndk
在最新的Android Studio2.2的preview版中,增加全新的ndk支持,使用了新的gradle,以及DSL语言. 新的NDK需要使用新的Gradle插件和新的Android插件来支持! ...
- android ndk开发(二)实现一个官方demo
实现了一个官方的demo:bitmap-plasma(水波纹) 源代码就在samples文件夹下,可以自己去找. 界面: 建立项目的步骤和配置环境不明白的可以去看:http://www.cnblogs ...
- !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-opencv-development-3/ Android Ndk a ...
- JNI/NDK开发指南(开山篇)
转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术, ...
- android studio下的NDK开发详解(一)
源地址:http://www.voidcn.com/blog/chengkaizone/article/p-5761016.html 好记性不如烂笔头,开始坚持写博客,学一点记一点,只为了生活更好. ...
- 简单的调用OpenCV库的Android NDK开发 工具Android Studio
前言 本博客写于2017/08/11, 博主非专业搞安卓开发, 只是工作的需要倒腾了下Android NDK相关的开发, 博文中有什么不正确.不严格的地方欢迎指正哈 本文后续也许还会有删改, 就 ...
随机推荐
- iOS 通览(一) - 技巧、特性及规范
一.编译器特性 1.ARC. ARC是编译器特性.项目中使用了ARC,编译器会在项目编译的时候自动添加OC对象计数器release代码.并且使用了ARC,项目中将不允许出现release.retain ...
- [SQL SERVER系列]存储过程,游标和触发器实例[原创]
自己写的存储过程与游标结合使用的实例,与大家分享,也供自己查阅,仅供参考: --使用游标循环处理,删除重复的记录 declare @UserID int ) ) declare @UnitFlag i ...
- iOS定位坐标转换工具-b
坐标系介绍 首先介绍一下目前的定位坐标系统1.地球坐标 :( 代号:GPS.WGS84 )--- 有W就是世界通用的也就是原始坐标体系,这是国际公认的世界标准坐标体系: 使用 WGS84 坐标系统的产 ...
- Java第一阶段总结
学习java已经一个多月的时间了,第一阶段总算完成了. 这中间遇到很多问题,通过问同学问学长,收获了很多,但也知道自己和其他同学相差很远.他们java第一阶段只用了不到一个月的时间,而我拖了很长时间, ...
- PHP截取字符串,获取长度,获取字符位置的函数
strstr(string,string) = strchr(,) //从前面第一次出现某个字符串的地方截取到最后strrchr(string,string) //从某个字符串从最后出现的位置截取到结 ...
- uva 10105
数学 杨辉三角 多项式系数 #include <cstdio> int f[13] = {1}; void init() { for (int i = 1; i < 13; i+ ...
- jquery 清空动态append添加元素,remove方法
<html> <head> <script type="text/javascript" src="jquery-1.9.1.js" ...
- Python性能鸡汤
http://pythoner.org/wiki/257/ 毫无疑问:Python程序没有编译型语言高效快速. 甚至Python拥护者们会告诉你Python不适合这些领域. 然而,YouTube已用P ...
- linux telnet命令参数及用法详解--telnet连接远程终端命令
功能说明:远端登入. 语 法:telnet [-8acdEfFKLrx][-b<主机alias.html' target='_blank'>别名>][-e<脱离字符>][ ...
- C++11 生产者消费者
下面是一个生产者消费者问题,来介绍condition_variable的用法.当线程间的共享数据发生变化的时候,可以通过condition_variable来通知其他的线程.消费者wait 直到生产者 ...