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)。

二、为什么使用NDK

1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。

2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。

3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

三、下载NDK之后,解压便可

注:1.在android-ndk-r10c目录下有一个samples的目录,里面存放着例子,可供学习。

2.注意NDK的环境变量,如:

![](https://img-blog.csdn.net/20150330170030524?waterma 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 rk/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2FvX2NodW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)

四、在Eclipse的Window->Preferences->Android->NDK,设置NDK路径,例如:

注:需检查ADT插件是否安装了Android Native Delelopment Tools(可在Eclipse - Help - Install new Software中检查)

**五、**新建一个Android工程后,在new出来的Project上右键点击Android Tools->Add Native Support…给库文件(.so)取个名字,如:hello

这时你会发现工程会多一个jni的文件夹,jni下有Android.mk和hello.cpp文件。

Android.mk是NDK工程的Makefile,hello.cpp就是NDK的源文件。

有关Android.mk文件的介绍:[http://blog.csdn.net/gao_chun/article/details/44656169](()

六、我们在hello.cpp中写下如下代码,可以参考samples目录中的hello-jni例子。

#include <jni.h>

extern “C” {

JNIEXPORT jstring JNICALL Java_com_hello_Main_stringFromJNI(JNIEnv *env,

jobject thiz) {

return env->NewStringUTF(“Hello jni”);

}

}

C代码中是:

return (*env)->NewStringUTF(env,“Hello jni!”);

C++代码是:

return env->NewStringUTF(“Hello jni!”);

JNI接口的命名规范是:[Java](()_ + 调用该方法的包名(包名的点用_代替) + _ + 调用该接口的类名 + _ + 方法名,对于实例方法,有两个参数是必要的,一个JNI的环境指针 JNIEnv *,另一个是调用该方法的Java实例 jobject

这里需要注意一点,按照如下的方式写,在程序运行后是报错的(注:是程序运行后会报错,不是该文件有错,该文件有错是因为java编辑器没有安装支持C/C++的插件所导致,在该文件编写完成后可以colse项目从新打开便可,或者clean):

报错信息如下:

**总结:使用extern "C"修饰,编译器会按C语言的方式编译和连接。在C语言中,函数编译之后函数名与C++函数编译之后不同,例如foo(int x, int y),C可能会编译成 _foo 的名字,而C++**因为支持重载,所以会编译成像 _foo_int_int 这种带参数的函数名。如果是按照C语言的编译方式,调用foo函数是找不到_foo的函数名就会报出函数名找不到的错误。所以要添加extern " C "修饰。

**七、**Main.java :

package com.hello;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class Main extends Activity {

//静态方法优先加载

static {

System.loadLibrary(“hello”);

}

Android NDK开发(一)环境搭建及运行示例相关推荐

  1. Android NDK开发-3-环境搭建

    1.创建Android工程 2.打开android-ndk32-r10-windows-x86_64\android-ndk-r10\samples例子 3.打开hello-jni,拷贝java代码和 ...

  2. Android NDK开发一 NDK环境搭建及cmake简介

    1 前言 关于NDK的介绍可以查看官方的介绍: https://developer.android.com/ndk/guides/index.html 一句话总结NDK:NDK(Native Deve ...

  3. 【安卓开发系列 -- 开发环境】Unbuntu 下 Android 持续集成打包环境搭建 -- Jenkins 构建工具安装(gradle + git + android 工具)

    [安卓开发系列 -- 开发环境]Unbuntu 下 Android 持续集成打包环境搭建 -- Jenkins 构建工具安装(gradle + git + android 工具) [1]Unbuntu ...

  4. JNI开发笔记(一)--Android Studio安装与环境搭建

    Android Studio安装与环境搭建 1. 前言 1.1 什么是JNI 1.2 JNI从零开发流程 2. Java环境配置 3. Android Studio安装 参考链接 1. 前言 工作中需 ...

  5. Android资源总结(开发工具/环境搭建/教程/论坛/博客/反编译工具)

    Android资源总结(开发工具/环境搭建/教程/论坛/博客/反编译工具) 在Android发展前景相当好的情况下,本人最近搜集了一些关于Android的相关资源,当然包含以前发布的博客内容,进行了一 ...

  6. 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

    文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...

  7. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

  8. Android NDK开发: 通过C/C++调用第三方so库

    文章目录 一.编写so库代码 二.安装Android NDK 三.编译so库 3.1 编辑Android.mk 3.2 编辑Application.mk 3.3 编译 四.集成到Android工程中 ...

  9. NdkDemo开发从环境搭建到入门提高

    1.环境搭建 2.添加Log打印到logcat 3.Android NDK开发相关知识集合 4.JNI 数据类型与 Java 数据类型的映射关系 5.C中处理Java中传递的字符串-字符串相加 htt ...

  10. android fmod,Android ndk开发:fmod语音学习(二)

    在上一篇文章中,介绍以及搭建了FMOD的Android示例,这篇文章是在上一篇文章的基础上写的.所以建议首先读一下我的这篇文章. 本文使用FMOD来实现变声效果,直接使用<Android ndk ...

最新文章

  1. 所谓移动IP是指(58);实现移动IP的关键技术是(59)。【答案】D B
  2. 为什么python不出结果_Python 的 Checksum 为什么结果是一长串数字而不是如下效果...
  3. python获取动态数据采集仪代理_Python3爬虫技术文档(3)——动态页面数据采集,三,获取...
  4. php代码重构,Shell在代码重构中的应用了解下
  5. ecshop静态、 ecshop伪静态、ecshop伪静态设置详细方法、ECSHOP静态化方法
  6. exit java_没有System.exit,如何退出Java程序?(通过用户输入?)
  7. 用C++实现十进制转二进制【个人思想】
  8. 信息学奥赛C++语言:火柴盒
  9. DCL 管理权限 mysql
  10. 外网质量监控系统实践之路
  11. Linux中的终端、控制台、tty、pty等概念
  12. 谷歌小姐姐搞出魔法画板:你随便画,补不齐算AI输
  13. kotlin中的异常处理_Kotlin异常处理
  14. 拓端tecdat|Matlab马尔可夫区制转换动态回归模型估计GDP增长率
  15. 你是《未来世界的幸存者》么?
  16. 华为对刷量、刷评论的惩罚是什么?有什么解决办法吗?
  17. 【TVM帮助文档学习】Relay的模式匹配
  18. 关于三代基因测序,你所需要知道的都在这儿!
  19. ES搜索引擎-简单入门
  20. 微信自动检测色情图片_python +itchat

热门文章

  1. 移动端服务器端身份证识别介绍
  2. 带你用最简单的方式获得小米完整root权限(无需刷第三方rom)
  3. 今天终于把荣耀6root了_附教程
  4. 华硕台式计算机编号,怎么查看华硕电脑设备序列号
  5. 深度学习技术在不同方向的应用及相关开源项目
  6. 正好股票开户有色金属应声大涨
  7. 用74ls90组成二十四进制计数器_六十进制应该怎么怎么设计呢?
  8. svn取消文件夹图标_SVN文件夹或文件不显示图标解决方法
  9. 城市轨道交通工程毕业论文题目
  10. android mtk 常用修改器,MTK android 可修改IMEI方法