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. JQuery笔记(三)选项卡

    通过jq封装的方法,可以更简单的制作一个选项卡 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  2. 移动HTML 5前端性能优化指南(转载)

    前端工程师的菜!最近移动Html 5越来越火,想有一个体验流畅的Html 5 应用,这篇优化指南就别放过咯.腾讯的同学将关键的注意点与优化方法都总结出来,全文高能干货,非常值得深度学习 >> ...

  3. Docker 总结

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+] Docker总结 简单介绍 1 Docker 架构 安装和环境配置 1 mac 11 brew安装 11 dmg文件安装 1 ...

  4. MySQL千万级数据JDBC插入

    案例语句: String sql = "LOAD DATA LOCAL INFILE '" + dataFilepath + "' into table " + ...

  5. 前端学习 html

    Html 前端学习 <!DOCTYPE html> < lang="en"> <head> <meta charset="UTF ...

  6. intellig idea 快捷键

    可以在设置中更改为 eclipse 风格的快捷键. 默认 按住 ctlr + 左键,会调整到对应的声明处, 如果有实现类,eclipse中给予了选择. 在idea 中如果想直接调整到实现类,那么采用快 ...

  7. ionic中$ionicPopover和$ionicModal

    Popover可点多个按钮弹出同一个浮动框但内容不一样.那想要在同一页面弹出不同的浮动框怎么办呢? 这事就用到了$ionicModal,他和$ionicPopover一样的用法. 请看图: html: ...

  8. MongoDB本地安装与启用(windows )

    MongoDB的安装与MongoDB服务配置 Mongo DB 是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式备受当前IT从业人员的青睐.Mongo DB很好的实现了 ...

  9. php +mysql 添加 删除 修改 insert into delete update

    INSERT INTO 插入数据库 $sql = "INSERT INTO subject (uid,fun,title) VALUES (3,88,'语文')"; $query ...

  10. 数据库出现1045 access denied for user 'root'@'localhost' using password yes (转)

    在mysql命令行中执行 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');  GRANT ALL PRIVILEGES ON *.*  ...