JNI的技术特点:

java能够调用native代码。
native代码能够调用java代码。
 
JNI的技术考虑:
实现java代码的平台无关型。
java语言发展初期使用C和C++代码,避免重复轮子的需要。
 
 
举例子说明:
MediaScanner.java文件
其中native_init()是native方法,是需要C和C++去实现的,
 
system.loadLibrary("medua_jni");为加载编译后的so文件。
 
那么对应java层要实现的代码就是:

然后看看JNI层的实现:
JNI层需要讲 java层的“.”转换为“_”
 
JNI的注册:
1静态注册:
MediaScanner.java文件按照这种方式生成的JNI代码就是如下代码:
静态注册是根据函数名建立java函数和JNI函数之间的关联关系的。
缺点:
1    需要通过javah来编译类里面含有native函数的class文件生成对应的jni代码
2    javah生成的名字过长了。
3    第一次调用native函数要根据函数名字来所有对应JNI层来建立关联关系。
 
动态注册:
JNINativeMedia的结构:

数据类型转换:
 
基本数据类型转换:
引用数据类型转换:
 
Java代码中中代码:
对应JNI代码:
java中的对象:MediaScannerClient对应JNI代码中的Jobject
仔细看代码出现多余的参数:

JNIEnv
 
JNIEnv内部结构图:
JNIEnv提供了一些JNI系统函数:
调用java函数;操作jobject对象等很多事情。
 
JNIEnv具有线程相关型:
每条线程对应的JNIEnv不能在其他线程中使用。
 
JNIEnv与JVM之间的关系:

通过JNIEnv操作jobject
JNIEnv的成员变量和成员函数
 
成员变量:jfieldID
成员函数:jmethodID
如何获取JNIEnv的成员变量和成员函数呢:
 
举例子:
 
如何通过jfield操作jobject?

jstring
 
看下例子:
 
类型标识表:
 
其实java也提供对应的生成工具方便开发:
 

垃圾回收:
JNI中的引用:
 
对local reference的释放:
对Global reference的释放:

JNI异常处理:
 

深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)的更多相关文章

  1. android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升

    android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升

  2. 转自邓凡平 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第七章 深入理解Wi-Fi P2P部分节选

    本章主要内容: 介绍Wi-Fi P2P相关知识: 介绍Android中WifiP2pService.wpa_supplicant的相关代码. 7.1  概述 承接第6章介绍的WSC,本章将继续介绍Wi ...

  3. 深入理解JNI 邓平凡

    深入理解JNI 邓凡平 1)使用的时候 :加载libmedia_jni.so 并接着调用JNI_Onload->register_android_media_MediaScanner动态注册JN ...

  4. Android深入理解JNI(二)类型转换、方法签名和JNIEnv

    相关文章 Android深入理解JNI系列 前言 上一篇文章介绍了JNI的基本原理和注册,这一篇接着带领大家来学习JNI的数据类型转换.方法签名和JNIEnv. 1.数据类型的转换 首先给出上一篇文章 ...

  5. Android深入理解JNI(一)JNI原理与静态、动态注册

    前言 JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层.这一个系列我们来一起深入学习JNI. ...

  6. 深入理解JNI

    深入理解JNI 最近在学习android底层的一些东西,看了一些大神的博客,整体上有了一点把握,也产生了很多疑惑,于是再次把邓大神的深入系列翻出来仔细看看,下面主要是一些阅读笔记. JNI概述 JNI ...

  7. 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化

    第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...

  8. 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数

    1.                 打开Eclipse,File-->New-->Project…-->Android-->AndroidApplication Projec ...

  9. 《android开发艺术探索》读书笔记(十四)--JNI和NDK编程

    接上篇<android开发艺术探索>读书笔记(十三)--综合技术 No1: Java JNI--Java Native Interface(java本地接口),它是为了方便java调用C. ...

随机推荐

  1. linux操作数据库

    1.显示数据库 show databases; 2.选择数据库 use 数据库名; 3.显示数据库中的表 show tables; 4.显示数据表的结构 describe 表名; 5.显示表中记录 S ...

  2. THML结构语义化之table/form

    以table/form标签语义化,做为博客首贴 应用场景1-table表格 <table> <caption> <thead> <th colspan=&qu ...

  3. Windows Azure Storage

    之前都是在博客园看别人的文章,今天开始就开启自己的博客咯,欢迎阅读,共同探讨! 简单点说Widows Azure Storage就是一个大的网盘,可以让用户存储任何想存储的数据,数据一旦存储到“云”中 ...

  4. sqlite增删改查

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  5. Thrift框架简介

    功能:实现各个服务模块之间的跨语言.跨平台的通信,是RPC框架的一种,与dubbo类似. Thrift的应用原理: Thrift的部分功能相当于代码生成引擎,使用Thrift定义的语言编写*.Thri ...

  6. Dubbo Zookeeper

    发布 Service:每个<dubbo:service/>在spring内部都会生成一个ServiceBean实例,ServiceBean的实例化过程中调用export方法来暴露服务 co ...

  7. cocos2d-3.x 创建动画

    1.多文件帧序列动画 TrademarkAnimation.h #ifndef __TRADEMARK_ANIMATION_H__ #define __TRADEMARK_ANIMATION_H__ ...

  8. zoj 2770 Burn the Linked Camp

    今天刚刚学差分约束系统.利用最短路求解不等式.世界真的好奇妙!感觉不等式漏下几个会导致WA!! #include<cstdio> #include<cstring> #incl ...

  9. The most orzed and orzing man

    The most orzed and orzing man 题目链接:http://acm.xidian.edu.cn/problem.php?id=1184 Sprague-Grundy定理:htt ...

  10. LOOPS

    LOOPS 题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3853 递推 设dp[i][j]为(i,j)到终点期望的使用魔力值,mp[i][ ...