今天,简单讲讲androidNDK开发一个小程序。

一.Android NDK 是什么

http://www.360doc.com/content/10/0420/23/155970_24064558.shtml

1、前言

  2009年6月26日,Google Android发布了NDK,引起了很多发人员的兴趣。NDK全称:Native Development Kit。下载地址为:http://developer.android.com/sdk/ndk/1.5_r1/index.html。

2、误解

  新出生的事物,除了惊喜外,也会给我们带来一定的迷惑、误解。

  在Google中搜索“NDK”,很多“Android终于可以使用C++开发”之类的标题,这是一种对Android平台编程方式的误解。其实,Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能使用Java”。在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,“Java+C”的编程方式是一直都可以实现的。

  当然这种误解的产生是有根源的:在Android SDK文档里,找不到任何JNI方面的帮助。即使第三方应用开发者使用JNI完成了自己的C动态链接库(so)开发,但是so如何和应用程序一起打包成apk并发布?这里面也存在技术障碍。我曾经花了不少时间,安装交叉编译器创建so,并通过asset(资源)方式,实现捆绑so发布。但这种方式只能属于取巧的方式,并非官方支持。所以,在NDK出来之前,我们将“Java+C”的开发模式称之为灰色模式,即官方既不声明“支持这种方式”,也不声明“不支持这种方式”。

2.2、误解二:有了NDK,我们可以使用纯C开发Android应用

  Android SDK采用Java语言发布,把众多的C开发人员排除在第三方应用开发外(注意:我们所有讨论都是基于“第三方应用开发”,Android系统基于Linux,系统级别的开发肯定是支持C语言的。)。NDK的发布,许多人会误以为,类似于Symbian、WM,在Android平台上终于可以使用纯C、C++开发第三方应用了!其实不然,NDK文档明确说明:it is not a good way。因为NDK并没有提供各种系统事件处理支持,也没有提供应用程序生命周期维护。此外,在本次发布的NDK中,应用程序UI方面的API也没有提供。至少目前来说,使用纯C、C++开发一个完整应用的条件还不完备。

3、NDK是什么

  对NDK进行了粗略的研究后,我对“NDK是什么”的理解如下:

  1、NDK是一系列工具的集合。

  • NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
  • NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
  • NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

  2、NDK提供了一份稳定、功能有限的API头文件声明。

  Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

  4、NDK带来什么

  1) NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。

  • 使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
  • 使用NDK,我们可以将需要保密的应用逻辑使用C开发。毕竟,Java包都是可以反编译的。
  • NDK促使专业so组件商的出现。(乐观猜想,要视乎Android用户的数量)

  2)NDK将是Android平台支持C开发的开端。

  NDK提供了的开发工具集合,使开发人员可以便捷地开发、发布C组件。同时,Google承诺在NDK后续版本中提高“可调式”能力,即提供远程的gdb工具,使我们可以便捷地调试C源码。在支持Android平台C开发,我们能感觉到Google花费了很大精力,我们有理由憧憬“C组件支持”只是Google Android平台上C开发的开端。毕竟,C程序员仍然是码农阵营中的绝对主力,将这部分人排除在Android应用开发之外,显然是不利于Android平台繁荣昌盛的。

二.一个简单的NDK示例。

1、环境配置:

新建项目,选中:Include C++ Support,AndroidStudio会为我们创建cpp文件夹、CMake文件、模块的Gradle也会做些相应的配置。

创建项目有可能会报NDK找不到之类的错误,右击项目 ->Open Module Setting->SDK Location 查看Android NDK location是否有配置起来,没有,就下载NDK,

或者直接去AndroidStudio Settings中配置,Appearance&Behavior->System Setings->android SDK,选中SDK Tools标签页,选择CMake,LLDB,NDK进行安装如下图

CMake是AndroidStudio2.2提供的构建C项目的工具,LLDB是用来调试C代码的。

上面需要的东西都配置好后,新建的项目就会多出cpp文件夹,模块Gradle也多了些配置,如下图

并且AndroidStudio已经帮我们创建了一个调用C的例子,直接运行项目,Activiity里的就可以成功调用到C的方法。

我们在Activity里创建一个native方法,直接报红,然后Alt+Enter,选第一个

接下来神奇的地方出现了,native-lib.cpp里自动帮我们添加了新的方法:

给该方法一个正确的返回值,然后在Activity中调用native方法。呵呵崩掉了!

项目可以通过编译,但是找不到C++里面的方法,这是因为CMake在编译C++代码的时候把刚才新建的C++函数漏掉了,怎么把他加上呢,注意到C++代码里面有一个extern "C"这句话了吗,这个是CMake的东西,把这句话放到最上面,然后加个大括号,把所有Java需要调用的方法都放里面,调整后的C++代码如下:

确保所有Java需要调用的C方法都放在extern "C"中,这样CMake才会帮我们正确编译。

然后运行项目,成功返回"Hello from C++ Too"。

切换到Project目录结构,app->.externalNativeBuild->release->obj->AndroidStudio为我们生成的so文件都在这里啦!!!!!

忘了说了,现在C++可以智能提示啦,好爽滑。

这样,就开发了一个简单的NDK程序,编译运行后,发现生成的libnative-lib.so在module对应的build\intermediates\cmake\debug\obj中,其他程序可以直接使用这个so文件进行NDK开发。

android NDk编程就讲完了。

就这么简单。



android NDk编程相关推荐

  1. Android NDK编程,引入第三方.so库

    android自带的编译工具NDK进行编译时(非单纯的调用第三方.so而是进行ndk编程),armeabi以及armeabi-v7a文件夹下的第三方so文件将会被删除,只会产生编译后的so文件,其他的 ...

  2. Android NDK编程小试---实现java和c语言的互掉

    实现功能 l  实现 java/C互相调用 android端java调用LibMain 进而执行C语言 并且传入字符数组 l  C语言回调java Natives类的OnMessage方法打印消息,实 ...

  3. ugui 转轮_Unity3D研究院之Android NDK编译C/C++结合Unity实现本地数据共享(二十八)...

    开始本篇文章之前我先为大家简单的介绍一下Android NDK编程的原理, 我们知道Android开发使用JAVA语言来编程它的运行效率要比C/C++低很多,为了让JAVA语言可以调用 C/C++ 这 ...

  4. android NDK 知识汇总

    原汇总: [eoeAndroid社区索引]android开发环境NDK教程问题汇总帖 http://www.eoeandroid.com/thread-165553-1-1.html 环境: Wind ...

  5. 细说Android 4.0 NDK编程pdf

    下载地址:网盘下载 <细说Android 4.0 NDK编程>内容简介:通过NDK,应用程序可以非常方便地实现Java与C∕C++代码的相互沟通.<细说Android 4.0 NDK ...

  6. ldflags android,Android 开发手记一 NDK编程实例

    Android开发手记一 ---- NDK编程实例 在Android上,应用程序的开发,大部分基于Java语言来实现.要使用c或是c++的程序或库,就需要使用NDK来实现.NDK是Native Dev ...

  7. 两分钟学会Android平台NDK编程(无须Eclipse和cygwin,可使用命令行打包多个so)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wangbin_jxust/article/details/37389383 之前在进行cocos2d ...

  8. 用Android Studio进行NDK编程入门实例

    参考了网上各种教程,跌跌撞撞最终才把流程走通,特此记录一下: 有必要先交代下开发环境: 操作系统:Win7 Android Studio 3.0.1 gradle 3.0.1 首先,新建一个Andro ...

  9. Android Studio JNI NDK编程(一)

    在Android Studio 上编写jni程序入门 1.下载NDK包,在谷歌官网(或者其他地方)下载NDK包,解压压缩包到你想存放的地方. 2.在Android Studio中添加NDK文件存放路径 ...

最新文章

  1. 坦白局!一个大厂 Java 工程师近 20 年的进阶心得
  2. 【思维导图总结——数据库系统概论】数据库安全性
  3. 数据中心业务价值永续的密码——施耐德电气全生命周期服务
  4. 先安装证书服务(CA),再安装IIS,导致默认certsrv站点不能访问
  5. ffmpeg基础库编程开发 读书笔记
  6. 持久代是方法区还是堆中的?
  7. 谷歌Auto-DeepLab:自动搜索图像语义分割架构算法开源实现
  8. 2021-07-12 原来我用的是CPU,更改方法
  9. E: Malformed line 60 in source list /etc/apt/sources.list (dist parse)
  10. 发布自己的CocoaPods的步骤
  11. 关于sql中字符串的疑惑
  12. pycharm初始配置
  13. 安装@vue/cli脚手架又又又出问题啦!!!
  14. 如何看待“大数据杀熟”现象(个人观点,仅供参考)
  15. 迅捷pdf在线转换html,迅捷PDF在线转换器在线pdf转换jpg步骤方法分享
  16. 导航电子地图制作甲级测绘资质
  17. 如何用Graphpad Prism 8制作箱型图
  18. [HCTF 2018] WarmUp
  19. java sqlserver 插入数据_java中怎样向SQLserver中插入数据
  20. 最新车载以太网解决方案,你知多少?

热门文章

  1. 03-身体部位-BodyParts(English)
  2. 1010. 一元多项式求导
  3. 【90】沟通:跨部门管理
  4. centos7编译安装pure-ftpd-1.0.42
  5. [网摘]关于产品运营
  6. Alwayson--问题总结二
  7. 景切换的时候加上遮罩
  8. 山东省枣庄市台儿庄区云平台运维故障处理一例
  9. 记一次treegrid checkbox 选择问题
  10. Mysql数据库的使用总结之ERROR 1146 (42S02)