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

简介: JNI的技术特点: java能够调用native代码。 native代码能够调用java代码。   JNI的技术考虑: 实现java代码的平台无关型。 java语言发展初期使用C和C++代码,避免重复轮子的需要。

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异常处理:
 



相关文章
|
21天前
|
Android开发
Android JNI与CAN通信遇到的问题总结
Android JNI与CAN通信遇到的问题总结
46 1
|
21天前
|
Android开发
Android JNI 报错(signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr )
Android JNI 报错(signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr )
113 1
|
21天前
|
Java Android开发
Android JNI 调用
Android JNI 调用
13 1
|
21天前
|
Java 开发工具 Android开发
OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)
OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)
217 0
|
21天前
|
传感器 Java 开发工具
[NDK/JNI系列03] Android Studio集成NDK开发环境
[NDK/JNI系列03] Android Studio集成NDK开发环境
25 0
|
21天前
|
Android开发
[Android jni] Bitmap与Mat对象的相互转换
[Android jni] Bitmap与Mat对象的相互转换
69 0
|
21天前
|
Java 开发工具 Android开发
[Android]JNI的基础知识
[Android]JNI的基础知识
60 0
[Android]JNI的基础知识
|
21天前
|
算法 Java 数据安全/隐私保护
Android App开发之利用JNI实现加密和解密操作实战(附源码 简单易懂)
Android App开发之利用JNI实现加密和解密操作实战(附源码 简单易懂)
100 0
|
21天前
|
XML Java API
Android App开发之创建JNI接口获取CPU指令集讲解及实战(附源码 简单易懂)
Android App开发之创建JNI接口获取CPU指令集讲解及实战(附源码 简单易懂)
58 0
|
21天前
|
Java 编译器 开发工具
Android StudioJNI开发之NDK环境的搭建以及添加JNI支持(图文解释 简单易懂)
Android StudioJNI开发之NDK环境的搭建以及添加JNI支持(图文解释 简单易懂)
42 0