问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C调用java时使用JNI的问题!急。。。

发布网友 发布时间:2022-04-24 09:46

我来回答

1个回答

热心网友 时间:2022-06-18 16:14

M,是其中的一个组成部分,更详细的看下面:

----------------------------------
操作系统装入jvm是通过jdk中java.exe来完成,通过下面4步来完成jvm环境.
1.创建jvm装载环境和配置
2.装载jvm.dll
3.初始化jvm.dll并挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类。

在我们运行和调试java程序的时候,经常会提到一个jvm的概念.jvm是java程序运行的环境,但是他同时一个操作系统的一个应用程序一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间.
首先来说一下jdk这个东西,不管你是初学者还是高手,是j2ee程序员还是j2se程序员,jdk总是在帮我们做一些事情.我们在了解java之前首先大师们会给我们提供说jdk这个东西.它在java整个体系中充当着什么角色呢?我很惊叹sun大师们设计天才,能把一个如此完整的体系结构化的如此完美.jdk在这个体系中充当一个生产加工中心,产生所有的数据输出,是所有指令和战略的执行中心.本身它提供了java的完整方案,可以开发目前java能支持的所有应用和系统程序.这里说一个问题,大家会问,那为什么还有j2me,j2ee这些东西,这两个东西目的很简单,分别用来简化各自领域内的开发和构建过程.jdk除了jvm之外,还有一些核心的API,集成API,用户工具,开发技术,开发工具和API等组成
好了,废话说了那么多,来点于主题相关的东西吧.jvm在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,提供一个完整的java运行环境,因此也就虚拟计算机. 操作系统装入jvm是通过jdk中java.exe来完成,通过下面4步来完成jvm环境.
1.创建jvm装载环境和配置
2.装载jvm.dll
3.初始化jvm.dll并挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类。
一.jvm装入环境,jvm提供的方式是操作系统的动态连接文件.既然是文件那就一个装入路径的问题,java是怎么找这个路径的呢?当你在调用java test的时候,操作系统会在path下在你的java.exe程序,java.exe就通过下面一个过程来确定jvm的路径和相关的参数配置了.下面基于windows的实现的分析.
首先查找jre路径,java是通过GetApplicationHome api来获得当前的java.exe绝对路径,c:\j2sdk1.4.2_09\bin\java.exe,那么它会截取到绝对路径c:\j2sdk1.4.2_09\,判断c:\j2sdk1.4.2_09\bin\java.dll文件是否存在,如果存在就把c:\j2sdk1.4.2_09\作为jre路径,如果不存在则判断c:\j2sdk1.4.2_09\jre\bin\java.dll是否存在,如果存在这c:\j2sdk1.4.2_09\jre作为jre路径.如果不存在调用GetPublicJREHome查HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\“当前JRE版本号”\JavaHome的路径为jre路径。
然后装载jvm.cfg文件JRE路径+\lib+\ARCH(CPU构架)+\jvm.cfgARCH(CPU构架)的判断是通过java_md.c中GetArch函数判断的,该函数中windows平台只有两种情况:WIN64的‘ia64’,其他情况都为‘i386’。以我的为例:C:\j2sdk1.4.2_09\jre\lib\i386\jvm.cfg.主要的内容如下:
-client KNOWN
-server KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR
在我们的jdk目录中jre\bin\server和jre\bin\client都有jvm.dll文件存在,而java正是通过jvm.cfg配置文件来管理这些不同版本的jvm.dll的.通过文件我们可以定义目前jdk中支持那些jvm,前面部分(client)是jvm名称,后面是参数,KNOWN表示jvm存在,ALIASED_TO表示给别的jvm取一个别名,WARN表示不存在时找一个jvm替代,ERROR表示不存在抛出异常.在运行java XXX是,java.exe会通过CheckJvmType来检查当前的jvm类型,java可以通过两种参数的方式来指定具体的jvm类型,一种按照jvm.cfg文件中的jvm名称指定,第二种方法是直接指定,它们执行的方法分别是“java -J”、“java -XXaltjvm=”或“java -J-XXaltjvm=”。如果是第一种参数传递方式,CheckJvmType函数会取参数‘-J’后面的jvm名称,然后从已知的jvm配置参数中查找如果找到同名的则去掉该jvm名称前的‘-’直接返回该值;而第二种方法,会直接返回“-XXaltjvm=”或“-J-XXaltjvm=”后面的jvm类型名称;如果在运行java时未指定上面两种方法中的任一一种参数,CheckJvmType会取配置文件中第一个配置中的jvm名称,去掉名称前面的‘-’返回该值。CheckJvmType函数的这个返回值会在下面的函数中汇同jre路径组合成jvm.dll的绝对路径。如果没有指定这会使用jvm.cfg中第一个定义的jvm.可以通过set _JAVA_LAUNCHER_DEBUG=1在控制台上测试.
最后获得jvm.dll的路径,JRE路径+\bin+\jvm类型字符串+\jvm.dll就是jvm的文件路径了,但是如果在调用java程序时用-XXaltjvm=参数指定的路径path,就直接用path+\jvm.dll文件做为jvm.dll的文件路径.
二:装载jvm.dll
通过第一步已经找到了jvm的路径,java通过LoadJavaVM来装入jvm.dll文件.装入工作很简单就是调用windows API函数:
LoadLibrary装载jvm.dll动态连接库.然后把jvm.dll中的导出函数JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArgs挂接到InvocationFunctions变量的CreateJavaVM和GetDefaultJavaVMInitArgs函数指针变量上。jvm.dll的装载工作宣告完成。
三:初始化jvm,获得本地调用接口,这样就可以在java中调用jvm的函数了.调用InvocationFunctions->CreateJavaVM也就是jvm中JNI_CreateJavaVM方法获得JNIEnv结构的实例.
四:运行java程序.
java程序有两种方式一种是jar包,一种是class. 运行jar,java -jar XXX.jar运行的时候,java.exe调用GetMainClassName函数,该函数先获得JNIEnv实例然后调用java类java.util.jar.JarFileJNIEnv中方法getManifest()并从返回的Manifest对象中取getAttributes("Main-Class")的值即jar包中文件:META-INF/MANIFEST.MF指定的Main-Class的主类名作为运行的主类。之后main函数会调用java.c中LoadClass方法装载该主类(使用JNIEnv实例的FindClass)。main函数直接调用java.c中LoadClass方法装载该类。如果是执行class方法。main函数直接调用java.c中LoadClass方法装载该类。

然后main函数调用JNIEnv实例的GetStaticMethodID方法查找装载的class主类中
“public static void main(String[] args)”方法,并判断该方法是否为public方法,然后调用JNIEnv实例的
CallStaticVoidMethod方法调用该java类的main方法。
另外,虚机团上产品团购,超级便宜追问感谢你花时间回答我的提问,

C调用java时使用JNI的问题!急。。。

java程序有两种方式一种是jar包,一种是class. 运行jar,java -jar XXX.jar运行的时候,java.exe调用GetMainClassName函数,该函数先获得JNIEnv实例然后调用java类java.util.jar.JarFileJNIEnv中方法getManifest()并从返回的Manifest对象中取getAttributes("Main-Class")的值即jar包中文件:META-INF/MANIF...

为什么C++通过JNI调用JAVA类函数速度慢近十倍

理论上用native方法比普通的Java方法运行效率要高一些。Java程序的运行时通过虚拟机来进行的,虽说提供了可移植性,但运行效率也比直接的可执行文件要低,因为多了很多不必要的中间过程。JNI是直接调用由C或C++生成的动态函数库,所以执行起来要快很多。

Java 运行时JNI问题?

1、在执行java的时候,要输入完整的包名+类名。否则在以后的测试调用过程中会发生java.lang.UnsatisfiedLinkError这个异常。2、错误的详细信息。3、CLASSPATH、PATH。4、写入程序出现问题 Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,...

请教JNI编程中C调用Java实现中NullPointerException问题

1、java 调用C++编写的dll,可使用JNI 或 Jawin 开源项目(推荐第二种方法)。2、C++ 调用java 的变量、方法,通过JNI (Java Native Interface)与java类交互。---操作步骤(只总结第二个)--- (1) vc6.0编译C++程序,开发环境设置:工具--》选项--》工具,工具标签下:选择“include files”...

如何在C/C++中调用Java

JNI答应运行在虚拟机的Java程序能够与其它语言(例如C和C++)编写的程序或者类库进行相互间的调用。同时JNI提供的一整套的API,答应将Java虚拟机直接嵌入到本地的应用程序中。图1是Sun站点上对JNI的基本结构的描述。本文将介绍如何在C/C++中调用Java方法,并结合可能涉及到的问题介绍整个开发的步骤及可能碰到的难题和解决...

java调用C,需要用到jdk/include下的jniport.h 文件,但是找不到?_百度...

有一个叫做jawin的开源项目提供了调用C的功能,自己开发难度比较大

这个“java错误提示”什么意思

java调用c的程序的时候需要JNI运行环境,但是没有找到运行环境就报这个错了 AGENT_ERROR_NO_JNI_ENV 以下引用他人blog 错误:ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/...

jni出现错误是什么意思?

jni错误可能是由于本地程序接口定义和Java程序接口定义不一致导致的。其他常见的原因包括本地程序库缺失、不正确的参数传递、内存泄漏以及线程问题。当出现jni错误时,需要对错误进行分析,追踪出问题来源,并及时解决问题,以避免影响程序正常运行。解决jni错误通常需要开发人员具备一定的jni编程能力,需要对jni...

如何在C/C++中调用Java

JNI允许运行在虚拟机的Java程序能够与其它语言(例如C和C++)编写的程序或者类库进行相互间的调用。同时JNI提供的一整套的API,允许将Java虚拟机直接嵌入到本地的应用程序中。

怎样用 jni来交互java与 c/c++

JNI是Java Native Interface的缩写,中文为JAVA本地调用。使用JNI可以很方便的用我们的Java程序调用C/C++程序。很多时候,某些功能用Java无法实现,比如说涉及到底层驱动的一些功能,这时候我们就可以利用JNI来调用C或者C++程序来实现,这就是JNI的强大之处。但是JNI也有它的缺点,使用java与本地已编译的...

java调用C java调用C静态库 C语言和Java的区别 做C的管理java团队 比较Java语言和C语言的异同 C程序中有调用关系的所有函数必须 OC调用C需要 C和java 国外java与C
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
四川灵猴工程管理有限公司怎么样? 邓光君湖北师范学院教授 四川伟豪建筑工程有限公司怎么样? 成都五月花投资管理有限公司怎么样? 四川同君企业管理有限公司怎么样? 一直很想知道一部电影的名字。是日本的,悲剧,讲的是一个小偷的故事,下... 异性朋友生日送什么礼物好啊? 公主抱女生有什么反应 ...摩托车什么手续都没有了,还能上牌照吗?都需要什么啊? ...长20厘米宽14厘米那样从四角剪去边长2厘米的正方体然后做成一个无盖... 如何从C中调用Java函数使用JNI 果冻手环电子表怎么调整时间日期只有一个按键 如何在c++中调用java代码 C语言如何调用Java语言 公积金贷款根据什么来定贷款额? 请问如何计算公积金贷款额? 成都限号时间是几点到几点 成都限号时间早上几点到晚上几点? 如何计算成都住房公积金贷款额度 成都限行几天能查到? 成都限号扣分一天扣几次 限号是怎么处罚的,是拍一次罚一次还是一天就罚一次? 成都限号时间几点到几? 四川成都红河在绕城外还是绕城内?限行吗? 成都限行被拍会怎么处罚 今天望都汽车尾号是限几号? 我想请问一下,我是阿坝州的牌照今天晚上到成都,但是有限号怎么办了?晚上几点才能进去,谢谢 沪c的车牌在成都限行吗? 成都今天2月24号限行吗? 请问,尿酸高的人可以吃豆腐吗? C调用Java有哪些方法 android ndk 开发,C++ 调用Java的方法 请教JNI编程中C调用Java实现中NullPointerException问题 C#调用Java时出现的问题Warning IKVMC0108: not a class file java怎么引用c 如何在c语言中使用java传入的String java如何调用c语言源文件并进行执行? 通过JNI,C调用Java方法,返回值是数组该怎么用 c调用java方法的时候CallObjectMethod这个方法一直错误,代码贴上 java如何调用c语言源文件并进行执行. 如何在C/C++中调用Java Java如何调用C语言代码 ? 花语大全:还亮草花语及传说是什么? 这株草花朵像翠雀(飞燕草),但叶子不像,有谁知道叫什么? 还亮草的主要价值 这叫什么花? 鱼灯苏的定义 天蓝鼠尾草清新漂亮,它是一种什么样的草?为什么有人用它的花泡茶喝? 赞美花草的句子 这是什么植物(花草还是树)