深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)

时间:2022-09-17 09:40:47

JNI的技术特点:

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

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

数据类型转换:
 
基本数据类型转换:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
引用数据类型转换:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
 
Java代码中中代码:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
对应JNI代码:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
java中的对象:MediaScannerClient对应JNI代码中的Jobject
仔细看代码出现多余的参数:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)

JNIEnv
 
JNIEnv内部结构图:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
JNIEnv提供了一些JNI系统函数:
调用java函数;操作jobject对象等很多事情。
 
JNIEnv具有线程相关型:
每条线程对应的JNIEnv不能在其他线程中使用。
 
JNIEnv与JVM之间的关系:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)

通过JNIEnv操作jobject
JNIEnv的成员变量和成员函数
 
成员变量:jfieldID
成员函数:jmethodID
如何获取JNIEnv的成员变量和成员函数呢:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
 
举例子:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
 
如何通过jfield操作jobject?
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)

jstring
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
 
看下例子:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
 
类型标识表:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
 
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
其实java也提供对应的生成工具方便开发:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
 

垃圾回收:
JNI中的引用:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
 
对local reference的释放:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
对Global reference的释放:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)

JNI异常处理:
深入理解JNI(《深入理解android》(author : 邓凡平)读书札记)
 

深入理解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. HTML5移动Web开发(八)——避免文本字体大小重置

    适用设备:iOS.Windows Mobile在一些移动设备上,比方说iPhone,Windows Mobile,当用户把手机切换到横屏时,浏览器会自动地重置文本字体大小.这可能会对我们造成困扰,因为 ...

  2. 【CodeVS 3153】取石子游戏

    http://codevs.cn/problem/3153/ 对于这道题,直觉告诉我每一个状态一定是必胜或必败的 然后设定操作次数t,t为取完些石子最多需要多少步. 如果\(a_i\)不为1,\(t= ...

  3. Python基础之函数等等

    三元运算 三元运算(三目运算),是对简单的条件语句的缩写. 1 2 3 4 5 # 书写格式   result = 值1 if 条件 else 值2   # 如果条件成立,那么将 "值1&q ...

  4. Object C学习笔记23-继承&comma;重写&comma;重载

    前面的学习都一直在使用Object C对象,但是没有具体总结过Object C中的对象使用特性,这里简单总结一下. 一.  继承 在面向对象编程中,子类可以通过继承得到父类的可以继承的的属性和方法,在 ...

  5. sqlserver中索引优化

    背景: MRO表中TimeStamp nvarchar(32),但实际上它存储的内容是日期(2015-09-09 11:20:30). 现在我要执行这样一个sql语句: Select t10.* fr ...

  6. BZOJ 3668 起床困难综合症

    按位贪心. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...

  7. python杂记-6&lpar;time&amp&semi;datetime模块&rpar;

    #!/usr/bin/env python# -*- coding: utf-8 -*-import timeprint(time.clock())##返回处理器时间,3.3开始已废弃 , 改成了ti ...

  8. cognos 10&period;2&period;2 Framework manager使用&rdquo&semi;数据源&rdquo&semi;新建查询主题

    又做了一个简单的报表,就是在Framework Manager中写个sum()的sql出个报表,可以使用使用"数据源"新建查询主题 配置查询主题后修改SQL,注意全部都是大写,要和 ...

  9. weblogic8&period;1在myeclipse中启动正常&comma;在单独的weblogic中无法正常启动的解决方案&period;

    应用程序服务器weblogic8.1.5,项目在myeclipse中启动正常,在单独的服务器中启动就报错了.错误如下图: 经过观察,发现在myeclipse中设置了以下的jar包.估计是这个问题引起的 ...

  10. iOS网络编程笔记——Socket底层实现笔记

    Socket简单底层实现笔记: 以Socket客户端编程为例: 1.导入头文件 #import <arpa/inet.h> #import <netinet/in.h> #im ...