溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么用java源代碼分析jvm.dll裝載過(guò)程

發(fā)布時(shí)間:2021-10-23 17:31:46 來(lái)源:億速云 閱讀:149 作者:柒染 欄目:編程語(yǔ)言

怎么用java源代碼分析jvm.dll裝載過(guò)程,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

簡(jiǎn)述
眾所周知java.exe是java class文件的執(zhí)行程序,但實(shí)際上java.exe程序只是
一個(gè)執(zhí)行的外殼,它會(huì)裝載jvm.dll(windows下,以下皆以windows平臺(tái)為例,
linux下和solaris下其實(shí)類似,為:libjvm.so),這個(gè)動(dòng)態(tài)連接庫(kù)才是java
虛擬機(jī)的實(shí)際操作處理所在。本文探究java.exe程序是如何查找和裝載jvm.dll
動(dòng)態(tài)庫(kù),并調(diào)用它進(jìn)行class文件執(zhí)行處理的。

源代碼
主要分析的源代碼為:
j2sesrcshareinjava.c
j2sesrcwindowsinjava_md.c

java.c是什么東西
‘java程序’源代碼
所謂‘java程序’,包括jdk中的java.exejavac.exejavadoc.exe,java.c源
代碼中通過(guò)JAVA_ARGS宏來(lái)控制生成的代碼,如果該宏沒(méi)定義則編譯文件控制生
成java.exe否則編譯文件控制生成其他的‘java程序’。
比如:
j2semakejavajavacMakefile(這是javac編譯文件)中:
$(CD) ../../sun/javac ; $(MAKE) $@ RELEASE=$(RELEASE) FULL_VERSION=$(FULL_VERSION)
j2semakesunjavacjavacMakefile(由上面Makefile文件調(diào)用)中:
JAVA_ARGS = "{ "-J-ms8m", "com.sun.tools.javac.Main" }"
則由同一份java.c代碼生成的javac.exe程序就會(huì)直接調(diào)用java類方法:
com.sun.tools.javac.Main,這樣使其執(zhí)行起來(lái)就像是直接運(yùn)行的一個(gè)exe文件,
而未定義JAVA_ARGS的java.exe程序則會(huì)調(diào)用傳遞過(guò)來(lái)參數(shù)中的類方法。

從java.c的main入口函數(shù)說(shuō)起
main()函數(shù)中前面一段為重新分配參數(shù)指針的處理。
然后調(diào)用函數(shù):CreateExecutionEnvironment,該函數(shù)主要查找java運(yùn)行環(huán)境的
目錄,和jvm.dll這個(gè)虛擬機(jī)核心動(dòng)態(tài)連接庫(kù)文件路徑所在。根據(jù)操作系統(tǒng)不同,
該函數(shù)有不同實(shí)現(xiàn)版本,但大體處理邏輯相同,我們看看windows平臺(tái)該函數(shù)的處
理(j2sesrcwindowsinjava_md.c)。

CreateExecutionEnvironment函數(shù)主要分為三步處理:
a、查找jre路徑。
b、裝載jvm.cfg中指定的虛擬機(jī)動(dòng)態(tài)連接庫(kù)(jvm.dll)參數(shù)。
c、取jvm.dll文件路徑。

實(shí)現(xiàn):
a、查找jre路徑是通過(guò)java_md.c中函數(shù):GetJREPath實(shí)現(xiàn)的。
該函數(shù)首先調(diào)用GetApplicationHome函數(shù),GetApplicationHome函數(shù)調(diào)用windows
API函數(shù)GetModuleFileName取java.exe程序的絕對(duì)路徑,以我的jdk安裝路徑為例,
為:“D:javaj2sdk1.4.2_04injava.exe”,然后去掉文件名取絕對(duì)路徑為:
“D:javaj2sdk1.4.2_04in”,之后會(huì)在去掉最后一級(jí)目錄,現(xiàn)在絕對(duì)路徑為:
“D:javaj2sdk1.4.2_04”。
然后GetJREPath函數(shù)繼續(xù)判斷剛剛?cè)〉穆窂?injava.dll組合成的這個(gè)java.dll
文件是否存在,如果存在則“D:javaj2sdk1.4.2_04”為JRE路徑,否則判斷取得
的“D:javaj2sdk1.4.2_04”路徑+jreinjava.dll文件是否存在,存在則
“D:javaj2sdk1.4.2_04jre”為JRE路徑。如果上面兩種情況都不存在,則從注
冊(cè)表中去查找(參見(jiàn)函數(shù)GetPublicJREHome)。

函數(shù):GetPublicJREHome先查找
HKEY_LOCAL_MACHINESoftwareJavaSoftJava Runtime EnvironmentCurrentVersion
鍵值“當(dāng)前JRE版本號(hào)”,判斷“當(dāng)前JRE版本號(hào)”是否為1.4做為版本號(hào),如果是則
取HKEY_LOCAL_MACHINESoftwareJavaSoftJava Runtime Environment“當(dāng)前JRE版本號(hào)”
JavaHome的路徑所在為JRE路徑。

我的JDK返回的JRE路徑為:“D:javaj2sdk1.4.2_04jre”。

b、裝載jvm.cfg虛擬機(jī)動(dòng)態(tài)連接庫(kù)配置文件是通過(guò)java.c中函數(shù):ReadKnownVMs實(shí)現(xiàn)
的。
該函數(shù)首先組合jvm.cfg文件的絕對(duì)路徑,JRE路徑+lib+ARCH(CPU構(gòu)架)+jvm.cfg
ARCH(CPU構(gòu)架)的判斷是通過(guò)java_md.c中GetArch函數(shù)判斷的,該函數(shù)中windows平
臺(tái)只有兩種情況:WIN64的‘ia64’,其他情況都為‘i386’。我的為i386所以jvm.cfg
文件絕對(duì)路徑為:“D:javaj2sdk1.4.2_04jrelibi386jvm.cfg”。文件內(nèi)容如
下:

## @(#)jvm.cfg   1.7 03/01/23# # Copyright 2003 Sun Microsystems, Inc. All rights reserved.# SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.# # ### List of JVMs that can be used as an option to java, javac, etc.# Order is important -- first in this list is the default JVM.# NOTE that this both this file and its format are UNSUPPORTED and# WILL GO AWAY in a future release.## You may also select a JVM in an arbitrary location with the# "-XXaltjvm=

" option, but that too is unsupported# and may not be available in a future release.#-client KNOWN-server KNOWN-hotspot ALIASED_TO -client-classic WARN-native ERROR-green ERROR


(如果細(xì)心的話,我們會(huì)發(fā)現(xiàn)在JDK目錄中我的為:“D:javaj2sdk1.4.2_04jreinclient”和“D:javaj2sdk1.4.2_04jreinserver”兩個(gè)目錄下都存在jvm.dll文件。而java正是通過(guò)jvm.cfg配置文件來(lái)管理這些不同版本的jvm.dll的。)

ReadKnownVMs函數(shù)會(huì)將該文件中的配置內(nèi)容讀入到一個(gè)JVM配置結(jié)構(gòu)的全局變量中,該函數(shù)首先跳過(guò)注釋(以‘#’開(kāi)始的行),然后讀取以‘-’開(kāi)始的行指定的jvm參數(shù),每一行為一個(gè)jvm信息,第一部分為jvm虛擬機(jī)名稱,第二部分為配置參數(shù),比如行:
“-client KNOWN”則“-client”為虛擬機(jī)名稱,而“KNOWN”為配置類型參數(shù),“KNOWN”
表示該虛擬機(jī)的jvm.dll存在,而“ALIASED_TO”表示為另一個(gè)jvm.dll的別名,“WARN”
表示該虛擬機(jī)的jvm.dll不存在但運(yùn)行時(shí)會(huì)用其他存在的jvm.dll替代執(zhí)行,而“ERROR”
同樣表示該類虛擬機(jī)的jvm.dll不存在且運(yùn)行時(shí)不會(huì)找存在的jvm.dll替代而直接拋出錯(cuò)誤
信息。

在運(yùn)行java程序時(shí)指定使用那個(gè)虛擬機(jī)的判斷是由java.c中函數(shù):CheckJvmType判斷,該函數(shù)會(huì)檢查java運(yùn)行參數(shù)中是否有指定jvm的參數(shù),然后從ReadKnownVMs函數(shù)讀取的jvm.cfg數(shù)據(jù)結(jié)構(gòu)中去查找,從而指定不同的jvm類型(最終導(dǎo)致裝載不同jvm.dll)。有兩種方法可以指定jvm類型,一種按照jvm.cfg文件中的jvm名稱指定,第二種方法是直接指定,它們執(zhí)行的方法分別是“java -J”、“java -XXaltjvm=”或“java -J-XXaltjvm=”。如果是第一種參數(shù)傳遞方式,CheckJvmType函數(shù)會(huì)取參數(shù)‘-J’后面的jvm名稱,然后從已知的jvm配置參數(shù)中查找如果找到同名的則去掉該jvm名稱前的‘-’直接返回該值;而第二種方法,會(huì)直接返回“-XXaltjvm=”或“-J-XXaltjvm=”后面的jvm類型名稱;如果在運(yùn)行java時(shí)未指定上面兩種方法中的任一一種參數(shù),CheckJvmType會(huì)取配置文件中第一個(gè)配置中的jvm名稱,去掉名稱前面的‘-’返回該值。CheckJvmType函數(shù)的這個(gè)返回值會(huì)在下面的函數(shù)中匯同jre路徑組合成jvm.dll的絕對(duì)路徑。

比如:如果在運(yùn)行java程序時(shí)使用“java -J-client test”則ReadKnownVMs會(huì)讀取參數(shù)“-client”然后查找jvm.cfg讀入的參數(shù)中是否有jvm名稱為“-client”的,如果有則去掉jvm名稱前的“-”直接返回“client”;而如果在運(yùn)行java程序時(shí)使用如下參數(shù):
“java -XXaltjvm=D:javaj2sdk1.4.2_04jreinclient test”,則ReadKnownVMs
會(huì)直接返回“D:javaj2sdk1.4.2_04jreinclient”;如果不帶上面參數(shù)執(zhí)行如:
“java test”,因?yàn)樵趈vm.cfg配置文件中第一個(gè)存在的jvm為“-client”,所以函數(shù)
ReadKnownVMs也會(huì)去掉jvm名稱前的“-”返回“client”。其實(shí)這三中情況都是使用的
“D:javaj2sdk1.4.2_04jreinclientjvm.dll”這個(gè)jvm動(dòng)態(tài)連接庫(kù)處理test這個(gè)class的,見(jiàn)下面GetJVMPath函數(shù)。

c、取jvm.dll文件路徑是通過(guò)java_md.c中函數(shù):GetJVMPath實(shí)現(xiàn)的。
由上面兩步我們已經(jīng)獲得了JRE路徑和jvm的類型字符串。GetJVMPath函數(shù)判斷CheckJvmType
返回的jvm類型字符串中是否包含了‘’或‘/’如果包含則以該jvm類型字符串+jvm.dll作為JVM的全路徑,否則以JRE路徑+in+jvm類型字符串+jvm.dll作為JVM的全路徑。

看看上面的例子,第一種情況“java -J-client test”jvm.dll路徑為:
JRE路徑+in+jvm類型字符串+jvm.dll 按照我的JDK路徑則為:
“D:javaj2sdk1.4.2_04jre”+“in”+“client”+“jvm.dll”。
第二種情況“java -XXaltjvm=D:javaj2sdk1.4.2_04jreinclient test”路徑為:
jvm類型字符串+jvm.dll即為:“D:javaj2sdk1.4.2_04jreinclient”+“jvm.dll”
第三種情況“java test”為:“D:javaj2sdk1.4.2_04jre”+“in”+“client”
+“jvm.dll”與情況一相同。所以這三種情況都是調(diào)用的jvm動(dòng)態(tài)連接庫(kù)“D:java
j2sdk1.4.2_04jreinclientjvm.dll”處理test類的。

我們來(lái)進(jìn)一步驗(yàn)證一下:
打開(kāi)cmd控制臺(tái):

設(shè)置java裝載調(diào)試
E:workjava_research>set _JAVA_LAUNCHER_DEBUG=1
情況一
E:workjava_research>java -J-client test.ScanDirectory
----_JAVA_LAUNCHER_DEBUG----
JRE path is D:javaj2sdk1.4.2_04jre
jvm.cfg[0] = ->-client<-
jvm.cfg[1] = ->-server<-
jvm.cfg[2] = ->-hotspot<-
jvm.cfg[3] = ->-classic<-
jvm.cfg[4] = ->-native<-
jvm.cfg[5] = ->-green<-
299 micro seconds to parse jvm.cfg
JVM path is D:javaj2sdk1.4.2_04jreinclientjvm.dll
2897 micro seconds to LoadJavaVM
JavaVM args:
version 0x00010002, ignoreUnrecognized is JNI_FALSE, nOptions is 2
option[ 0] = '-Djava.class.path=.'
option[ 1] = '-Dsun.java.command=test.ScanDirectory'
50001 micro seconds to InitializeJVM
Main-Class is 'test.ScanDirectory'
Apps' argc is 0
10208 micro seconds to load main class
----_JAVA_LAUNCHER_DEBUG----
usage: java test.ScanDirectory DIR [output file]
情況二
E:workjava_research>java -XXaltjvm=D:javaj2sdk1.4.2_04jreinclient test.ScanDirectory
----_JAVA_LAUNCHER_DEBUG----
JRE path is D:javaj2sdk1.4.2_04jre
jvm.cfg[0] = ->-client<-
jvm.cfg[1] = ->-server<-
jvm.cfg[2] = ->-hotspot<-
jvm.cfg[3] = ->-classic<-
jvm.cfg[4] = ->-native<-
jvm.cfg[5] = ->-green<-
386 micro seconds to parse jvm.cfg
JVM path is D:javaj2sdk1.4.2_04jreinclientjvm.dll
2795 micro seconds to LoadJavaVM
JavaVM args:
version 0x00010002, ignoreUnrecognized is JNI_FALSE, nOptions is 2
option[ 0] = '-Djava.class.path=.'
option[ 1] = '-Dsun.java.command=test.ScanDirectory'
49978 micro seconds to InitializeJVM
Main-Class is 'test.ScanDirectory'
Apps' argc is 0
9598 micro seconds to load main class
----_JAVA_LAUNCHER_DEBUG----
usage: java test.ScanDirectory DIR [output file]
情況三
E:workjava_research>java test.ScanDirectory
----_JAVA_LAUNCHER_DEBUG----
JRE path is D:javaj2sdk1.4.2_04jre
jvm.cfg[0] = ->-client<-
jvm.cfg[1] = ->-server<-
jvm.cfg[2] = ->-hotspot<-
jvm.cfg[3] = ->-classic<-
jvm.cfg[4] = ->-native<-
jvm.cfg[5] = ->-green<-
381 micro seconds to parse jvm.cfg
JVM path is D:javaj2sdk1.4.2_04jreinclientjvm.dll
3038 micro seconds to LoadJavaVM
JavaVM args:
version 0x00010002, ignoreUnrecognized is JNI_FALSE, nOptions is 2
option[ 0] = '-Djava.class.path=.'
option[ 1] = '-Dsun.java.command=test.ScanDirectory'
50080 micro seconds to InitializeJVM
Main-Class is 'test.ScanDirectory'
Apps' argc is 0
10215 micro seconds to load main class
----_JAVA_LAUNCHER_DEBUG----
usage: java test.ScanDirectory DIR [output file]
三個(gè)的JVM路徑都為:
JVM path is D:javaj2sdk1.4.2_04jreinclientjvm.dll

其他情況
E:workjava_research>java -J-server test.ScanDirectory
----_JAVA_LAUNCHER_DEBUG----
JRE path is D:javaj2sdk1.4.2_04jre
jvm.cfg[0] = ->-client<-
jvm.cfg[1] = ->-server<-
jvm.cfg[2] = ->-hotspot<-
jvm.cfg[3] = ->-classic<-
jvm.cfg[4] = ->-native<-
jvm.cfg[5] = ->-green<-
377 micro seconds to parse jvm.cfg
JVM path is D:javaj2sdk1.4.2_04jreinserverjvm.dll
2985 micro seconds to LoadJavaVM
JavaVM args:
version 0x00010002, ignoreUnrecognized is JNI_FALSE, nOptions is 2
option[ 0] = '-Djava.class.path=.'
option[ 1] = '-Dsun.java.command=test.ScanDirectory'
62382 micro seconds to InitializeJVM
Main-Class is 'test.ScanDirectory'
Apps' argc is 0
12413 micro seconds to load main class
----_JAVA_LAUNCHER_DEBUG----
usage: java test.ScanDirectory DIR [output file]
E:workjava_research>java -XXaltjvm=D:javaj2sdk1.4.2_04jreinserver test.ScanDirectory
----_JAVA_LAUNCHER_DEBUG----
JRE path is D:javaj2sdk1.4.2_04jre
jvm.cfg[0] = ->-client<-
jvm.cfg[1] = ->-server<-
jvm.cfg[2] = ->-hotspot<-
jvm.cfg[3] = ->-classic<-
jvm.cfg[4] = ->-native<-
jvm.cfg[5] = ->-green<-
376 micro seconds to parse jvm.cfg
JVM path is D:javaj2sdk1.4.2_04jreinserverjvm.dll
2937 micro seconds to LoadJavaVM
JavaVM args:
version 0x00010002, ignoreUnrecognized is JNI_FALSE, nOptions is 2
option[ 0] = '-Djava.class.path=.'
option[ 1] = '-Dsun.java.command=test.ScanDirectory'
62725 micro seconds to InitializeJVM
Main-Class is 'test.ScanDirectory'
Apps' argc is 0
8942 micro seconds to load main class
----_JAVA_LAUNCHER_DEBUG----
usage: java test.ScanDirectory DIR [output file]

由上面可以看出,如果我們安裝了多個(gè)jdk或jre版本的話,使用“java -XXaltjvm=”
可以通過(guò)絕對(duì)路徑指定到其他版本的jvm.dll上去,至于能不能運(yùn)行還有待測(cè)試。

我們下面回到j(luò)ava.c的main函數(shù)中看看上面找到的jvm.dll是如何裝載掛接執(zhí)行的。

該操作大致分為三步:
a、裝載jvm.dll動(dòng)態(tài)連接庫(kù)。
b、初始化jvm.dll并掛接到JNIEnv(JNI調(diào)用接口)實(shí)例。
c、調(diào)用JNIEnv實(shí)例裝載并處理class類。

實(shí)現(xiàn):
a、裝載jvm.dll動(dòng)態(tài)連接庫(kù)是由main函數(shù)調(diào)用java_md.c中LoadJavaVM函數(shù)實(shí)現(xiàn)的。
main函數(shù)首先構(gòu)造了一個(gè)InvocationFunctions結(jié)構(gòu)的局部變量,InvocationFunctions
結(jié)構(gòu)有兩個(gè)函數(shù)指針:

typedef struct {    CreateJavaVM_t CreateJavaVM;    GetDefaultJavaVMInitArgs_t GetDefaultJavaVMInitArgs;} InvocationFunctions;

函數(shù)LoadJavaVM中先調(diào)用windows API函數(shù):LoadLibrary裝載jvm.dll動(dòng)態(tài)連接庫(kù),
之后將jvm.dll中的導(dǎo)出函數(shù)JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArgs
掛接到InvocationFunctions變量的CreateJavaVM和GetDefaultJavaVMInitArgs函數(shù)
指針變量上。jvm.dll的裝載工作宣告完成。

b、初始化jvm.dll并掛接到JNIEnv(JNI調(diào)用接口)實(shí)例是通過(guò)java.c中函數(shù):
InitializeJVM完成的。
main方法中首先定義了一個(gè)JNIEnv結(jié)構(gòu)的指針,JNIEnv結(jié)構(gòu)中定義了許多與裝載class
類文件、查找類方法、調(diào)用類方法有關(guān)的函數(shù)指針變量。InitializeJVM會(huì)調(diào)用上面
以掛接jvm.dll中JNI_CreateJavaVM的InvocationFunctions結(jié)構(gòu)變量的CreateJavaVM方法,即調(diào)用jvm.dll中函數(shù)JNI_CreateJavaVM,該函數(shù)會(huì)將JNIEnv結(jié)構(gòu)的實(shí)例返回到main中的JNIEnv結(jié)構(gòu)的指針上。這樣main中的JNIEnv指針獲取了JNIEnv實(shí)例后,就可以開(kāi)始對(duì)class文件進(jìn)行處理了。

c、調(diào)用JNIEnv實(shí)例裝載并處理class類。
a)如果是執(zhí)行jar包。
如果執(zhí)行的是一個(gè)jar包的話,main函數(shù)會(huì)調(diào)用java.c中的函數(shù):GetMainClassName,該函數(shù)使用JNIEnv實(shí)例構(gòu)造并調(diào)用java類:java.util.jar.JarFile中方法getManifest()并從返回的Manifest對(duì)象中取getAttributes("Main-Class")的值,即jar包中文件:
META-INF/MANIFEST.MF指定的Main-Class的主類名作為運(yùn)行的主類。
之后main函數(shù)會(huì)調(diào)用java.c中LoadClass方法裝載該主類(使用JNIEnv實(shí)例的FindClass)。
b)如果是執(zhí)行class方法。
main函數(shù)直接調(diào)用java.c中LoadClass方法裝載該類。

然后main函數(shù)調(diào)用JNIEnv實(shí)例的GetStaticMethodID方法查找裝載的class主類中
“public static void main(String[] args)”方法,并判斷該方法是否為public方法,然后調(diào)用JNIEnv實(shí)例的CallStaticVoidMethod方法調(diào)用該java類的main方法。

總結(jié)
由上面的代碼分析可以看出幾個(gè)問(wèn)題。
a、為什么JDK和JRE不一定通過(guò)安裝,直接拷到硬盤上,設(shè)置path環(huán)境變量就可以執(zhí)行。因?yàn)閖ava運(yùn)行獲取jre路徑的首選方法正是直接通過(guò)獲取java.exe絕對(duì)路徑來(lái)判斷的,如果通過(guò)修改注冊(cè)表選項(xiàng)而不設(shè)置path環(huán)境變量也可以找到j(luò)re路徑所在。修改方法如下:
首先我們將java.exe拷到任意目錄下,我的拷到e: emp下,在cmd中運(yùn)行:
清空path環(huán)境變量
E: emp>set path=
E: emp>java
Error opening registry key 'SoftwareJavaSoftJava Runtime Environment'
Error: could not find java.dll
Error: could not find Java 2 Runtime Environment.

導(dǎo)入如下注冊(cè)表文件(java.reg)

Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINESOFTWAREJavaSoft][HKEY_LOCAL_MACHINESOFTWAREJavaSoftJava Runtime Environment]"CurrentVersion"="1.4"[HKEY_LOCAL_MACHINESOFTWAREJavaSoftJava Runtime Environment1.4]"JavaHome"="D:javaj2sdk1.4.2_04jre"


再執(zhí)行顯示執(zhí)行正常,如下:

E: emp>javaUsage: java [-options] class [args...]           (to execute a class)   or  java [-options] -jar jarfile [args...]           (to execute a jar file)where options include:    -client       to select the "client" VM    -server       to select the "server" VM    -hotspot      is a synonym for the "client" VM  [deprecated]                  The default VM is client.    -cp-classpathA ; separated list of directories, JAR archives,                  and ZIP archives to search for class files.    -D=set a system property    -verbose[:class|gc|jni]                  enable verbose output    -version      print product version and exit    -showversion  print product version and continue    -? -help      print this help message    -X            print help on non-standard options    -ea[:...|:]    -enableassertions[:...|:]                  enable assertions    -da[:...|:]    -disableassertions[:...|:]                  disable assertions    -esa | -enablesystemassertions                  enable system assertions    -dsa | -disablesystemassertions                  disable system assertions

b、java.exe是通過(guò)jvm.cfg文件或直接指定jvm.dll路徑來(lái)裝載執(zhí)行java程序的。
見(jiàn)上面例子。
c、不同實(shí)現(xiàn)版本的jvm.dll必然存在一個(gè)名為:JNI_CreateJavaVM的導(dǎo)出函數(shù),
java.exe正是通過(guò)調(diào)用該函數(shù)獲得JNIEnv調(diào)用接口來(lái)裝載執(zhí)行class類的。這個(gè)
函數(shù)也是我們下一步研究java vm實(shí)作技巧的研究出發(fā)點(diǎn)。
JNI_CreateJavaVM函數(shù)位于:hotspotsrcsharevmprimsjni.cpp文件中。[@more@]

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI