第2章 框架基础JNI

JNI(Java Native Interface,Java本地接口)是Java平台上定义的一套标准的本地编程接口。JNI允许Java代码与本地代码互操作,即Java代码可以调用本地代码,本地代码也可以调用Java代码。所谓本地代码指的是用其他编程语言(如C/C++)实现的、依赖于特定硬件和操作系统的代码。通过JNI调用本地代码,可以实现Java语言所不能实现的功能。在Android平台上,Dalvik虚拟机会实现JNI定义的接口。

2.1 JNI在Android系统中所处的位置

Android采用分层的体系结构:上层的应用层和应用框架层主要使用Java语言开发;下层则运行一个Linux内核,并在内核之上集成了各种核心库和第三方库,以提供系统运行所需的服务,这部分是用C和C++语言开发。连接这两部分的纽带就是JNI。
JNI在Android系统中所处的位置如图2-1所示。

从图2-1中可以看出,JNI可以直接调用本地代码库,并可以通过Dalvik虚拟机实现与应用层和应用框架层之间的交互。Android JNI部分的代码主要位于Android体系结构中的上面两层:

应用层:采用NDK开发,主要使用标准JNI编程模型实现。

应用框架层:Android定义了一套JNI编程模型,使用函数注册方式弥补了标准JNI编程模型的不足。

Android应用框架层JNI部分源码主要位于frameworks/base/目录下。按照模块组织,不同的模块将被编译为不同的共享库,分别为上层提供不同的服务。这些共享库最终会被放置在目标系统的/system/lib目录下。

注意 NDK与JNI的区别: NDK是为便于开发基于JNI的应用而提供的一套开发和编译工具集;而JNI则是一套编程接口,可以运用在应用层,也可以运用在应用框架层,以实现Java代码与本地代码的互操作。

JNI编程模型的结构十分清晰,可以概括为以下三个步骤:
步骤1 Java层声明Native方法。
步骤2 JNI层实现Java层声明的Native方法,在JNI层可以调用底层库或者回调Java层方法。这部分将被编译为动态库(SO文件)供系统加载。
步骤3 加载JNI层代码编译后生成的共享库。
JNI的很多概念比较模糊,为了不引起歧义,这里规定本书中的涉及名词的含义。

native:特指Java语言中的方法修饰符native。

Native方法:特指Java层中声明的、用native修饰的方法。

JNI层:特指采用JNI技术实现Java层声明的Native方法的部分。

JNI函数:特指JNIEnv提供的函数。

JNI方法:特指Native方法对应的JNI层实现方法。

了解了JNI的主要概念和基本结构,下一节将以一个实例详细分析JNI编程的三个步骤。

《Android的设计与实现:卷I》——第2章 框架基础JNI相关推荐

  1. 《Android的设计与实现:卷I》迷你书

    为什么80%的码农都做不了架构师?>>>    <Android的设计与实现:卷I>迷你书         本书是Android应用开发工程师和Android系统工程师进 ...

  2. Android Bander设计与实现 - 设计篇

    摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...

  3. 谷歌正式推出官方“Android界面设计”网站

    谷歌Android团队今天正式推出了官方的"Android界面设计"网站.该网站提供了大量用于Android程序界面开发的资料,包括一般界面设计指南.设计模式以及建筑模块等等.长期 ...

  4. android教程 - android ui 介绍,多图详解 “Android UI”设计官方教程

    我们曾经给大家一个<MeeGo移动终端设备开发UI设计基础教程>,同时很多朋友都在寻找Android UI开发的教程,我们从Android的官方开发者博客找了一份幻灯片,介绍了一些Andr ...

  5. android ui秘笈,看图说话 – Android UI 设计秘笈 :Part I

    Android 的官方开发者博客发了一份幻灯片,介绍了一些 Android UI 设计的小贴士,Roger 在这里以看图说话的形式发出来,有兴趣的读者就继续往下翻吧.整个 PPT 共分5个部分,Par ...

  6. Android RecyclerView设计通用Adapter

    RecylerView 的使用频率现在也算做是很高了吧?使用起来的确是挺方便的,也容易实现一些比较好看的效果 一.一般步骤 一般的设计流程都是如下所示 首先是需要一个 JavaBean 来承载数据,包 ...

  7. Android用户界面设计:框架布局

    框架布局是将控件组织在Android程序的用户界面中最简单的布局类型之一. 理解布局对于良好的Android程序设计来说是非常重要的.在这个教程里,你将学到所以关于框架布局的知识,它们主要用来在屏幕上 ...

  8. Android用户界面设计“.NET研究”:框架布局

    框架布局是将控件组织在Android程序的用户界面中最简单的布局类型之一. 理解布局对于良好的Android程序设计来说是非常重要的.在这个教程里,你将学到所以关于框架布局的知识,它们主要用来在屏幕上 ...

  9. android产品设计,Android产品设计

    Android产品设计,我们深信,凝聚一群人,用心在一件事上,为客户创造价值,它必将赢得客户的足够尊重和信赖. Android产品设计, 随着Android平台的扩张,引发了Android人才荒,20 ...

最新文章

  1. c语言表达式3178的值为,【C语言】C语言运算符
  2. linux下使用yum安装mysql
  3. Serverless 微服务实践-移动应用包分发服务
  4. java错误页面显示错误信息_Struts2在JSP页面中显示错误信息和提示信息的方法
  5. PHP只下载不打开文件
  6. 监管升级,央行变相加息,贷款难还在继续
  7. cuba 平台_CUBA平台的理念
  8. topcoder SRM712 Div1 LR
  9. 开源:Taurus.MVC 框架 (已支持.NET Core)
  10. 非printf形式的十六进制和二进制打印(雅虎面试题)
  11. crash fault-tolerant protocols和Byzantine fault-tolerant protocols区别
  12. ubuntu 下 4412烧写SuperBoot
  13. win10安装mysql初始化失败怎么办_Win10系统安装SQL2000失败 初始化错误该怎么解决?...
  14. MindManager模板百度云下载分享教程
  15. 英文简历的写法和模板
  16. Kesci:Tensorflow 实现 LSTM——时间序列预测(超详细)
  17. 受损固态硬盘(SSD)数据恢复方法
  18. java提示结果集已耗尽,java 结果集已耗尽
  19. context 浅析
  20. Java编程思想日志

热门文章

  1. 浅玩JavaScript的数据类型判断
  2. [Ruby]转载: 关于ruby中 %Q, %q, %W, %w, %x, %r, %s 的用法
  3. C# 调用ArcGIS server admin api
  4. mysql 5.6 初始化_MySQL 5.6 关于登陆的初始化设置
  5. MongoDB中的读写锁
  6. Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-上
  7. UVA11388GCD LCM
  8. 操作系统原理第一章:操作系统概述
  9. 【错误记录】VMware 虚拟机报错 ( 向 VMWare 虚拟机中的 Ubuntu 系统拷贝文件时磁盘空间不足 ② | 删除交换空间 )
  10. 【错误记录】Android Studio 编译报错 ( A problem occurred starting process ‘command ‘ninja.exe‘ ‘ )