《Android的设计与实现:卷I》——第1章 2.2JNI框架层实例分析-阿里云开发者社区

开发者社区> 华章计算机> 正文

《Android的设计与实现:卷I》——第1章 2.2JNI框架层实例分析

简介: 本节书摘来自华章出版社《Android的设计与实现:卷I》——第1章,第2.2节。作者: 杨云君著.更多章节内容可以访问云栖社区“华章计算机”公众号查看。
+关注继续查看

2.2 JNI框架层实例分析

框架层大量使用了JNI技术来完成对系统运行库的调用。深入理解JNI对分析框架层代码十分有用。本节将以框架层的实例详细讲解JNI编程的三个步骤。

在Android应用程序开发中,一般是调用应用框架层的android.util.Log.java提供的Java接口来使用日志系统。比如我们会写如下代码输出日志:
Log.d(TAG,"debug log");

这个Java接口其实是通过JNI调用系统运行库(即本地库)并最终调用内核驱动程序Logger把Log写到内核空间中的。在Android中, Log系统十分通用,而且其JNI结构非常简洁,很适合作为JNI入门的例子。本节就以它为例贯穿始终,详细讲解JNI各部分的内容。

本节所涉及的文件包括:
frameworks/base/core/jni/android_util_Log.cpp(JNI层实现代码)
frameworks/base/core/java/android/util/Log.java(Java层代码)
libnativehelper/include/nativehelper/jni.h(JNI规范的头文件)
libnativehelper/include/nativehelper/JNIHelp.h
libnativehelper/JNIHelp.cpp
frameworks/base/core/jni/AndroidRuntime.cpp
读者可以在Source Insight或者Eclipse中打开这几个文件为下面的分析做准备。

2.2.1 Log系统Java层分析

首先看Log系统Java层部分。打开Log.java文件,可以看到这里面只定义了isLoggable和println_native两个Native方法,其代码如下:
package android.util;
public final class Log {
……
public static int d(String tag, String msg) {

//使用Native方法打印日志。LOG_ID_MAIN表示日志ID,有4种:main、radio、events、system
return println_native(LOG_ID_MAIN, DEBUG, tag, msg);

}
……

//声明Native方法isLoggable
public static native boolean isLoggable(String tag, int level);

……
/** @hide / public static final int LOG_ID_MAIN = 0;
/** @hide / public static final int LOG_ID_RADIO = 1;
/** @hide / public static final int LOG_ID_EVENTS = 2;
/** @hide / public static final int LOG_ID_SYSTEM = 3;

//声明Native方法println_native

/** @hide / public static native int println_native(int bufID,

                  int priority, String tag, String msg);

}

Java层需要做的就这么简单。只需要声明方法为native而无需实现,就可以直接调用,不会出现任何编译错误。
接下来看JNI层的实现代码。

2.2.2 Log系统的JNI层

JNI层是实现Java层方法最关键的部分。还是以Log系统为例讲解JNI层是如何实现Java层声明的Native方法的。不熟悉JNI的读者可以根据包名和类名定位JNI层文件,对于Log类,其对应的JNI文件是android_util_Log.cpp。
打开android_util_Log.cpp文件,其代码如下:

image
image

从这里以看出,JNI层的实现方法只是根据一定的规则与Java层声明的方法做了一个映射,然后可以通过使用本地库函数或JNIEnv提供的JNI函数响应Java层调用。
读者只需要熟悉这部分代码的大体结构和功能即可,后续章节将会详细介绍这部分内容。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
高性能网络I/O框架-netmap源码分析(1)
高性能网络I/O框架-netmap源码分析(1) 作者:gfree.wind@gmail.com 博客:blog.focus-linux.net linuxfocus.blog.chinaunix.net 微博:weibo.com/glinuxer QQ技术群:4367710 前几天听一个朋友提到这个netmap,看了它的介绍和设计,确实是个好东西。
974 0
高性能网络I/O框架-netmap源码分析(2)
作者:gfree.wind@gmail.com 博客:blog.focus-linux.net linuxfocus.blog.chinaunix.net 微博:weibo.com/glinuxer QQ技术群:4367710 前面e1000_probe的分析,按照Linux驱动框架,接下来就该e1000_open。
919 0
Linux USB Host-Controller的初始化代码框架分析【转】
转自:http://blog.csdn.net/zkami/article/details/2496770 usb_hcd_omap_probe (const struct hc_driver *driver) (dev/ohci/ohci-omap.
816 0
RPC框架Dubbo深入分析
1,背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本 此时,用于简化增删改查工作量的 ...
2197 0
使用AppFabric 承载WCF和WF服务-实例分析和说明
针对Pro Windows Server AppFabric ISBN-13 (pbk): 978-1-4302-2817-2图书中的例子进行修改和分析 这个例子的应用场景如下: 前端是Asp.
776 0
基于对象存储 OSS 的智能数据分析处理框架和功能
今年参加了 2019 全球闪存峰会(Flash Memory World),分享了“基于云存储的智能数据分析处理架构”,重点介绍在对象存储 OSS 之上的数据处理功能,现整理相关内容和大家探讨。
2132 0
10059
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载