需要用到NDK

  Android 平台从诞生起,就已经支持 C、C++开发。众所周知,Android 的 SDK 基于 Java 实现,这意味着基于 Android SDK 进行开发的第三方应用都必须使用 Java 语言。但这并不等同于“第三方应用只能使用 Java”。在 Android SDK 首次发布时,Google 就宣称其虚拟机 Dalvik 支持 JNI 编程方式,也就是第三
方应用完全可以通过 JNI 调用自己的 C 动态库,即在 Android 平台上,“Java+C”的编程方式是一直都可以实现的。不过,Google 也表示,使用原生 SDK 编程相比 Dalvik 虚拟机也有一些劣势,Android SDK 文档里,找不到任何 JNI 方面的帮助。即使第三方应用开发者使用 JNI 完成了自己的 C 动态链接库(so)开发,但是 so 如何和应用程序一起打包成 apk 并发布?这里面也存在技术障碍。比如程序更加复杂,兼容性难以保障,无法访问 Framework API,Debug 难度更大等。开发者需要自行斟酌使用。
于是 NDK 就应运而生了。NDK 全称是 Native
Development Kit。
            NDK 的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。NDK 将是 Android 平。

NDK 的安装
1.NDK 的下载
           NDK 的官方下载地址 http://developer.android.com/tools/sdk/ndk/index.html,由于官方网址在国外,国内访问不了,必须得FQ。因此我提供了下载好的 NDK
工具放在百度网盘上供大家下载。http://pan.baidu.com/s/1jGpCDKi

2.NDK 解压到一个不包含空格和中文的目录下
本人将 NDK 解压在D:\soft\Android\android-ndk-r9b-windows-x86 中

NDK 目录结构说明

build:该目录存放的使用 NDK
的 mk 脚本,mk
脚本指定了编译参数

docs:该目录存放的是 NDK
的使用帮助文档

platforms:这里面存放的是与各个 Android
版本相关的平台(x86,arm,mips)相关 C
语言库和头文件

prebuilt:预编译工作目录

samples:存放的是演示程序

sources:存放的是 NDK
工具链的 C 语言源码

tests:测试相关的文件

toolchains:工具链,存放了三种架构的静态库等文件ndk-build.cmd:Window
平台使用 NDK 的命令

ndk-build:Linux
平台使用 NDK 的命令

JNI使用

1、        
创建一个新的 Android 工程《JNI 入门》 ,工程的最终目录结构如下图所示

2、        

MainActivity.java 类中定义一个 native 方法

定义一个 native 方法,意思是该方法的具体实现交给 C 语言实现

3、        
在工程跟目录下创建一个文件夹 jni,该目录名称是约定(约定优于配置)好的,不能是其他名字。

4、        

jni 目录下创建 hello.c 源文件, 文件名可以按照见名知意的规则来创建。 hello.c 代码清单如下:

5、        
将jni.h文件和Android.mk文件以及Application.mk文件拷贝到jni文件夹下,怎么拷贝:从下载的ndk里找,找不到mk文件自己创建也可以。

Android.mk内容如下:

Application.mk内容如下:

该清单其实只有一行内容, 第一行是注释。 APP_ABI 参数指定要生成的目标文件支持的平台都有哪些,默认是 armeabi 如果想支持多个平台只需要空一格然后写出其他平台名字即可。

6、        

cmd 中,将当前目录切换到 hello.c 所在目录,然后重新执行 ndk-build.cmd 命令,这次成功编译,cmd 显示效果如下图所示:

执行完成后刷新libs会多出两个so动态库。

查看项目目录结构,发现在 libs 目录中多了两个文件夹 armeabi 和 x86,这两个文件夹下分别包含了一个 libhello.so 动态链接库。这也代表着当前工程中的动态库支持 arm 架构和 x86 架构的 cpu。

7、        
MainActivity.java 中调用 C 语言

在active_main.xml中添加代码如下:

8、        
运行结果:

JNI 数据类型和数据结构

初识JNI的更多相关文章

  1. JNI初识

    JNI:Java Native Interface 的简写,是Java语言提供的一种通用接口,用于Java代码与本地化代码的交互. 所谓本地化代码是指直接编译成的与计算机相关的二进制代码,而非Java ...

  2. JVM初识、调优

    JVM是按照运行时数据的存储结构来划分内存结构的,JVM在运行java时,将他们划分成几种不同格式的数据,分别存储在不同的区域,这些数据统一称为运行时数据,运行时数据包括java程序本身的数据信息和J ...

  3. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  4. 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

    相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...

  5. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  6. JNI 备注

    本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...

  7. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  8. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

  9. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

随机推荐

  1. [moka同学笔记]YII2.0 判断签约状态,sql的两种查询方法

    方法一: //判断签约状态 $signed = 0; $sql="SELECT * from usho_community_sign_record WHERE com_id=$r->i ...

  2. No.014:Longest Common Prefix

    问题: Write a function to find the longest common prefix string amongst an array of strings. 官方难度: Eas ...

  3. Erlang垃圾回收机制的二三事

    声明:本片文章是由Hackernews上的[Erlang Garbage Collection Details and Why ItMatters][1]编译而来,本着学习和研究的态度,进行的编译,转 ...

  4. Jquery UI 和Easy UI常用插件

    一.Jquery的插件简介 (一)什么是插件 插件(Plug-in)是一种遵循一定的应用程序接口规范编写出来的程序,是原有系统平台或应用软件平台功能的一种扩展和补充. 注意!!其只能在程序规定的系统平 ...

  5. Dense.js - 响应式的视网膜(Rtina)图像支持

    Dense 是一款 jQuery 插件,它提供一个简单的方法为设备提供精密像素比的图像,为你的网站带来视网膜支持,清除模糊,图像更清晰.通过简单地包括 jQuery 插件的页面上,就能实现响应式的视网 ...

  6. Materialize - 响应式 Material Design 框架

    由谷歌创建和设计的 Material Design(材料设计)是一种设计语言,结合成功的设计的经典原则以及创新科技.谷歌的目标是开发一个设计系统,让所有的产品在任何平台上拥有统一的用户体验. Mate ...

  7. react native 学习一(环境搭配和常见错误的解决)

    react native 学习一(环境搭配) 首页,按照http://reactnative.cn/docs/0.30/getting-started.html#content上的介绍,下载安装pyt ...

  8. 【iScroll源码学习03】iScroll事件机制与滚动条的实现

    前言 想不到又到周末了,周末的时间要抓紧学习才行,前几天我们学习了iScroll几点基础知识: 1. [iScroll源码学习02]分解iScroll三个核心事件点 2. [iScroll源码学习01 ...

  9. php获取数组第一个值 current()

    获取数组第一个元素的值,如果是数字索引那还好,直接$array[0],如果键名是字符串,你又未知这个字符串呢?用current()函数就可以做到. current() 函数返回数组中的当前元素(单元) ...

  10. linux命令学习使用记录

    1.文件批量重命名:把所有.xml文件重命名.txt,第一个参数为文件名中字符串,第二个参数为替换后文件名,第三个为当前目录文件列表 rename .xml .txt *.xml 2.解压不显示过程: ...