我是靠谱客的博主 背后心情,最近开发中收集的这篇文章主要介绍jni基础入门jvm,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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<传参类型>,比如调用AppInfogetVersionCode对应的就是CallIntMethod,调用setVersionCode对应的就是CallVoidMethod方法

jni获取java对象的属性值

获取java对象的属性对应的值的方法为GetXXXXField,XXXX 为数据类型,比如GetIntFieldGetShortField等等,如果不是基本型则为GetObjectField,如果属性为static的则加上Static,比如GetStaticIntFieldGetStaticObjectField。在jni中是不看成员变量的作用域的,不管你是privateprotectedpublic的,加finnal也一样,它都可以读取里面的值,和反射不一样

  • 基础类型

    javac++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 |

  • 引用类型

    javac++
    All objectsjobject
    java.lang.Class 实例jclass
    java.lang.String 实例jstring
    arraysjarray
    Object[]jobjectArray
    boolean[]jbooleanArray
    byte[]jbyteArray
    char[]jcharArray
    short[]jshortArray
    int[]jintArray
    long[]jlongArray
    float[]jfloatArray
    double[]jdoubleArray
    booleanarrayjboolenarray
    java.lang.throwablejthrowable
  • 类型签名

    签名类型
    Zboolean
    Bbyte
    Cchar
    Sshort
    Iint
    Jlong
    Ffloat
    Ddouble
    L fully-qualified-classfully-qualified-class
    [ typetype[]
    (arg-types)ret-typemethod 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/6cbdda111570

Android 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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部