概述
Java调用C++
静态注册
1.1将需要用本地代码实现的Java方法加上native声明
1.2使用javac命令编译Java类
1.3使用javah命令生成.h头文件
1.4使用本地语言实现头文件中声明的方法
1.5将本地代码编译生成动态链接库
1.6在Java类中加载这一动态链接库
C++调用Java
为了能获取java层面的一些参数或调用java层的函数
jni调用java对象的方法
调用对象的某个方法 Call<返回类型>Method<传参类型>,比如调用AppInfo
的getVersionCode
对应的就是CallIntMethod
,调用setVersionCode
对应的就是CallVoidMethod
方法
jni获取java对象的属性值
获取java对象的属性对应的值的方法为GetXXXXField
,XXXX 为数据类型,比如GetIntField
,GetShortField
等等,如果不是基本型则为GetObjectField
,如果属性为static
的则加上Static
,比如GetStaticIntField
,GetStaticObjectField
。在jni中是不看成员变量的作用域的,不管你是private
,protected
,public
的,加finnal
也一样,它都可以读取里面的值,和反射不一样
-
基础类型
java c++ size/type
| boolen | jboolean | unsigned 8 |
| byte | jbyte | signed 8 |
| char | jchar | unsigned 16 |
| short | jshort | signed 16 |
| int | jint | signed 32 |
| long | jlong | s 64 |
| float | jfloat | s 32 |
| double | jdouble | s 64 |
| void | void | 0 |
-
引用类型
java c++ All objects jobject java.lang.Class 实例 jclass java.lang.String 实例 jstring arrays jarray Object[] jobjectArray boolean[] jbooleanArray byte[] jbyteArray char[] jcharArray short[] jshortArray int[] jintArray long[] jlongArray float[] jfloatArray double[] jdoubleArray booleanarray jboolenarray java.lang.throwable jthrowable -
类型签名
签名 类型 Z boolean B byte C char S short I int J long F float D double L fully-qualified-class fully-qualified-class [ type type[] (arg-types)ret-type method type
keywords
field id:类中public参数ID
method id:类中public方法的ID
本地引用:不能在本地函数中跨函数使用,不能跨线程使用。函数返回后局部引用所引用的对象会被JVM自动释放,或调用DeleteLocalRef释放(*env)->DeleteLocalRef(env,local_ref)
全局引用:可以跨方法、跨线程使用。JVM不会自动释放,必须调用DeleteGlobalRef手动释放(*env)->DeleteGlobalRef(env,g_cls_string);
弱全局引用:不会阻止GC回收所引用的对象,可以跨方法、跨线程使用。引用不会自动释放,在JVM认为应该回收它的时候(比如内存紧张的时候)进行回收而被释放。或调用DeleteWeakGlobalRef手动释放。(*env)->DeleteWeakGlobalRef(env,g_cls_string)
reference
https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html
https://blog.csdn.net/zhang_jun_ling/article/details/78302523utm_source=blogxgwz7xxxxxxxxxx
https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.htmlhttps://blog.csdn.net/zhang_jun_ling/article/details/78302523?utm_source=blogxgwz7
https://www.jianshu.com/p/6cbdda111570Android JNI和NDK学习(07)–JNI的常用API
Android-JNI开发系列《六》jni与java的交互
jvm
#一句话概括jvm所要解决的核心问题:就是其所提出的口号,如何实现“write once,run anywhere”
#jvm所包括的子系统:
JIT
Interpreter
内存分配和回收
线程管理
#常用概念
规范---定义标准
实现---软硬件集合
实例---运行进程
#jvm的核心模块如下:
1. 类加载器classloader和双亲委派模型
#将字节码以一定的方式加载到虚拟机中。
#虚拟机中存在如下几种classloader的类型,自定义强度逐级增强:
bootstrap classloader
extension classloader
system classloader
user classloader
#双亲委派模型是一种加载class的策略,简而言之是一种层级查询的过程。user---system---extension---bootstrap
2. runtime data areas(运行时数据区)
#对程序运行所需要的不同类型的数据进行分类存放,模拟出stack、heap、methodarea等多个抽象部分。
3. 堆和垃圾回收
#GC是一种堆内存回收的算法
4. 执行引擎(Execution Engine)
#执行引擎解析的是字节码,先获取指令的opcode和操作数然后执行他们,如此循环往复直到线程正常或异常结束
#jvm对字节码的处理方式有如下几种:
- 字节码通过执行引擎来解释执行(一般的jvm虚拟机采用的就是这种方式)
- 字节码将频率高的字节码翻译成机器码直接在物理机上执行(Dalvik虚拟机采用的JIT技术就是这种方式)
- 字节码直接转换为机器码,直接在物理机上执行。(art虚拟机采用的aot技术就是如此)
#执行引擎最广泛的有两种实现方式:基于寄存器的和基于栈的
5. 基于寄存器和基于栈的jvm实现
Dalvik/Art(基于jvm规范的虚拟机)
===================================
#组成Android虚拟机的核心子系统包括但不限于:
runtime、classloader system、execution engine system、heap manager、GC系统、JIT、JNI环境
#在Android4.4(kitkat)版本之前,Android系统采用的Java虚拟机时Dalvik,从4.4版本起引入了art虚拟机
#Dalvik的出现为的是能够在资源有限的设备上(内存小,处理器能力弱)解决jvm所存在的一些问题,从而能够支撑Java的执行。采用了如下一些解决方案:
- 多个class融合进Dex文件中,节省空间。(Dex还是一种字节码)
- Dex文件可以在多个进程之间共享
- 在运行程序前进行字节码的检验
- 优化字节码,让程序运行更块,节约电量
- 保证安全,共享代码为只读
#而art的出现也还是为了解决“运行速度”的问题
#Dalvik采用JIT(just in time)技术将热点字节码编译成目标的机器码。
#art采用aot(ahead of time)技术会将字节码全部转换为机器码(OAT格式)。如此则最大程度提高运行速率。
app
----------
framework
----------
Dalvik/art
----------
jni
-----------
c/c++(lib,so)
---------------
kernel
最后
以上就是背后心情为你收集整理的jni基础入门jvm的全部内容,希望文章能够帮你解决jni基础入门jvm所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复