首页 > 编程知识 正文

jvm源码是什么语言,做java还是android好

时间:2023-05-04 20:19:32 阅读:57930 作者:1738

JNI实现可以包含两个主要类:JNIEnv和JavaVM。

javavm :代表Java的此虚拟机。 的所有工作都从获取虚拟机接口开始。

第一种方法是在加载动态链接库时,JVM调用jni_onload(javavm*JVM,void* reserved )。 如果定义了此函数。 第一个参数传递给JavaVM指针。

第二种方法是在本机代码中调用jni_createJavaVM(JVM,) void * * (env,vm_args )时,得到JavaVM指针。

在这两种情况下,检索的指针都可以保存在全局变量(如JavaVM* g_jvm )中,以便在任何上下文中使用。

Android系统使用第二种方法Invocation interface创建JVM。

JNIEnv:JNI接口指针是提供JNI Native函数的基础环境,线程相关,不同线程的JNI env相互独立。

JNIEnv仅对当前线程有效。 本地方法不能将JNIEnv从一个线程传递到另一个线程。 如果在同一Java线程中多次调用本地方法,则传递给该本地方法的JNIEnv相同。 但是,本地方法是在不同的Java线程中调用的,因此可以接受不同的JNIEnv。

JavaVM可以在进程中的线程之间共享。 理论上,上一个进程可以有多个JavaVM,但Android只允许一个(JavaVm and JIEnv )。 必须强调的是,JNIEnv与线程有关。 sdk文档突出显示了do not cache JNIEnv*,如果使用它,则使用不同的线程以JavaVM *jvm的方式获取与当前线程关联的JNIEnv*。 两者都可以理解为“函数表”。 前者是使用Java程序创建的运行时环境,依赖于JVM提供JNI Native函数。

Java和Android中的JavaVM对象有区别

在java中,每个process可以生成多个java vm对象,而在android中,每个process只有一个Dalvik虚拟机对象。 也就是说,android进程在单个虚拟机对象上服务所有java和c/c代码。

Java的dex字节码和c/c *.so在Dalvik虚拟机中同时运行,共享一个进程空间。 之所以能够进行交互调用,也是因为有Dalvik虚拟机。 如果java代码需要c/c代码,则在将Dalvik虚拟机加载到*.so库中时,首先调用jni_Onload (),并将指向JAVA VM对象的指针指向c层JNI组件的全局环境当java层调用c层本地函数时,调用c层本地函数的线程始终通过Dalvik虚拟机调用c层本地函数。Dalvik虚拟机实例化本地c组件的JNIEnv指针此指针指向Dalvik虚拟机的特定函数列表,并且在JNI的c组件调用Java层的方法或属性时,必须使用JNIEnv指针调用。 如果希望获取本地c/c用于当前线程的JNIEnv,可以使用Dalvik虚拟机对象的JavaVM* jvm-GetEnv返回当前线程所在的JNIEnv*。

如何构建全局JavaVM :

通过1//Java调用构建JNI环境

2 jniexportvoidjava _ com _ nan _ thread _ my thread activity _ setjnienv (JNI env * env,jobject obj )3)4/) /记录到子线程

5(env )-getJavaVM(env,g_jvm ); 6 //不能直接分配值(g_obj=obj ) )。

7g_obj=(env )-newglobalref ) env,obj ); 8 }

获取JNIEvn方法:

1jnienv*jni_getenv(int*attach ) 2if ) jni_JVM==null ) 3返回null; 4

5 Int状态; 6

判断是否有7//attachcurrentthread

8 *attach=0; 9

10 JNIEnv *_jniEnv=NULL; 11

12status=(jni_JVM )-getenv ) jni_JVM,) void ** ) _jniEnv,JNI_VERSION_1_6); 13

14if (status==JNI _ edetached|_ JNI env==null ) 15status=(jni_JVM )-attachcurrentthread(jni_JVM,165292; 18 ) else{19*attach=1; 20(21 ) 22return_jnienv; 23 }

回收env :

1 intJNI_DelEnv () 2if ) jni_JVM==null )3 return -1; 4

5返回(jni_JVM )-detachcurrentthread ) jni_JVM ); 6 }

java线程不能使用AttachCurrentThread和DetachCurrentThread方法获取JNIEnv。 否则会发生错误。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。