本文目錄一覽:
JAVA VM是什麼意思
java虛擬機,是java實現跨平台的工具。
java生成的class文件在虛擬機上執行,通過生成不同平台上的代碼,實現跨平台。而不用編成人員為了在不同的平台上運行,而寫不同的代碼。
JNIEnv和JavaVM的區別
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,JNIEnv介面
JavaVM介面
第一種方式,在載入動態鏈接庫的時候,JVM會調用JNI_OnLoad(JavaVM* jvm, void* reserved)(如果定義了該函數)。第一個參數會傳入JavaVM指針。
第二種方式,在native code中調用JNI_CreateJavaVM(jvm, (void**)env, vm_args)可以得到JavaVM指針。
兩種情況下,都可以用全局變數,比如JavaVM* g_jvm來保存獲得的指針以便在任意上下文中使用。
Android系統是利用第二種方式Invocation interface來創建JVM的。
JNIEnv介面
JNI開發最常見的錯誤就是濫用了JNIEnv介面。需要強調的是JNIEnv是跟線程相關的。
在native method中,JNIEnv作為第一個參數傳入。那麼在JNIEnv不作為參數傳入的時候,該如何獲得它?JNI提供了兩個函數:(*jvm)-AttachCurrentThread(jvm, (void**)env, NULL)和(*jvm)-GetEnv(jvm, (void**)env, JNI_VERSION_1_2)。兩個函數都利用JavaVM介面獲得JNIEnv介面,上面已經講到如何獲得JavaVM介面。
JNI規範也說明,可以將獲得JNIEnv封裝成一個函數。
1
2
3
4
5
6
JNIEnv* JNU_GetEnv()
{
JNIEnv* env;
(*g_jvm)-GetEnv(g_jvm, (void**)env, JNI_VERSION_1_2);
return env;
}
載入java vm時windows出現錯誤 2怎麼解決
解決方法:
UG NX11.0點擊「install liscense server」因為JAVA安裝出現問題:
載入 JAVA VM時WINDOWS 出現錯誤:2」
改變JAVA的配置方法:
1)不要使用JAVA安裝教程中的JAVA_HOME變數。
2)建立PATH和CLASSPATH時使用絕對路徑,不要使用%JAVA_HOME%。即將%JAVA_HOME%用C:\Program Files\Java\jdk1.8.0_144(jdk安裝路徑)手動替換。
然後,UG NX11.0就能繼續進行下去。
Java是一種可以撰寫跨平台應用程序的面向對象的程序設計語言。Java 技術具有卓越的通用性、高效性、平台移植性和安全性,廣泛應用於PC、數據中心、遊戲控制台、科學超級計算機、行動電話和互聯網,同時擁有全球最大的開發者專業社群。
Java 不同於一般的編譯執行計算機語言和解釋執行計算機語言。它首先將源代碼編譯成二進位位元組碼(bytecode),然後依賴各種不同平台上的虛擬機來解釋執行位元組碼,從而實現了「一次編譯、到處執行」的跨平台特性。
不過,每次的編譯執行需要消耗一定的時間,這同時也在一定程度上降低了 Java 程序的運行效率。但在 J2SE 1.4.2 發布後,Java 的執行速度有了大幅提升。
與傳統程序不同,Sun 公司在推出 Java 之際就將其作為一種開放的技術。全球數以萬計的 Java 開發公司被要求所設計的 Java 軟體必須相互兼容。
「Java 語言靠群體的力量而非公司的力量」是 Sun 公司的口號之一,並獲得了廣大軟體開發商的認同。這與微軟公司所倡導的注重精英和封閉式的模式完全不同。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/185388.html