一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 解析本地方法映射Java層的數據類型

解析本地方法映射Java層的數據類型

2021-04-13 11:27github Java教程

這篇文章給大家介紹了本地方法映射Java層的數據類型,包括基礎類型映射,引用類型映射等等,對java層數據類型映射相關知識,感興趣的朋友跟隨腳本之家小編一起看看吧

 

前言

Java 語言上定義了不同的數據類型,比如有基礎類型int、double等等,還有所有類的父類Object等,這些都是 Java 層面的類型,而使用本地方法的處理過程需要有它們對應的類型。

 

大概的流程

Java 層編寫的本地方法,被編譯器編譯為字節碼,字節碼將按照規范將不同類型的參數給記錄到 class 文件中,比如 B 表示 byte、I 表示 int、J 表示 long 等等。那么一個如下的本地方法,被記錄為(Ljava/lang/Object;II)V。

?
1
public static native void test(Object o, int i, int i2);

上述對應的方法被注冊JVM中,當執行到調用本地方法時則會按照類型映射轉換成本地數據類型,比如int->jint和Object->jobject。這里其實 int 和 jint 在 C++ 中是一樣的,只是用 typedef 定義了另外一個名稱而已,而 jobject 是一個指針,執行引擎在執行 Java 層邏輯時生成了 Object 對象,它在 JVM 層有專門的數據結構,這里的 jobject 就是指向這個結構的指針,在需要使用時可以強制轉換成 JVM 層的數據結構,然后即可對其進行操作。另外,JVM 中用 oop 來表示對象指針。

 

基礎類型映射

 

Java Type Native Type value
boolean jboolean true或false
byte jbyte -128~127
short jshort -pow(2,15)~pow(2,15)-1
int jint -pow(2,31)~pow(2,31)-1
long jlong -pow(2,63)~pow(2,63)-1
float jfloat IEEE754標準單精度浮點數
double jdouble IEEE754標準雙精度浮點數
char jchar 16位不帶符號,Unicode字符

 

 

引用類型映射

除了基礎的類型映射外,Java 層其他對象類型為引用類型,那么本地方法對應的是 jobject 類型,另外,它還會派生出經常用的一些子類,比如 jstring、jclass 等等,具體如下,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class _jobject {};
class _jclass : public _jobject {};
class _jthrowable : public _jobject {};
class _jstring : public _jobject {};
class _jarray : public _jobject {};
class _jbooleanArray : public _jarray {};
class _jbyteArray : public _jarray {};
class _jcharArray : public _jarray {};
class _jshortArray : public _jarray {};
class _jintArray : public _jarray {};
class _jlongArray : public _jarray {};
class _jfloatArray : public _jarray {};
class _jdoubleArray : public _jarray {};
class _jobjectArray : public _jarray {};

可以看到定義了_jobject類,該類為空類,而其他的類包括_jclass _jthrowable _jstring _jarray都是繼承_jobject類。此外,數組類型還派生出了9個子類,分別對應基礎類型數組和引用類型數組。

前面定義完類后再定義指針別名,這里的就是本地方法的類型了。另外,這些都是 C++ 的定義,如果是 C 編譯器則會使用 struct 來定義 _jobject,而非 class。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef _jobject *jobject;
typedef _jclass *jclass;
typedef _jthrowable *jthrowable;
typedef _jstring *jstring;
typedef _jarray *jarray;
typedef _jbooleanArray *jbooleanArray;
typedef _jbyteArray *jbyteArray;
typedef _jcharArray *jcharArray;
typedef _jshortArray *jshortArray;
typedef _jintArray *jintArray;
typedef _jlongArray *jlongArray;
typedef _jfloatArray *jfloatArray;
typedef _jdoubleArray *jdoubleArray;
typedef _jobjectArray *jobjectArray;

 

CPP的空類

上面的引用類型定義為空類,這里了解下C++的空類,通常我們要定義一個空類可以如下兩種方式,

?
1
2
class Empty{}
struct Empty{}

經過上述定義后的空類,它的大小為1,但是一個空類啥都沒有的話它有什么用呢?其實它可以用來區分不同的對象,空類定義的不同對象擁有不同的地址,使用new操作出來的對象也有不同的指針,而且空類也能區分不同的類別。

 

指針轉換

所以有了這些類型映射后我們是怎么聯系起來使用的呢?其實很簡單,答案就是進行指針轉換,前面提到過 Java 層的對象在 JVM 中是有一定的數據結構的,即用 oop 來表示對象指針,那么 jobject 可以作如下轉換,其中 handle 即為 jobject 類型。

?
1
oop result = *reinterpret_cast<oop*>(handle);

轉換成 oop 后要進一步處理就很方便了,比如想要獲取一些類相關的元數據時可以使用其中的 klass 來獲取。

 

總結

以上,Java 層定義的類型在本地方法有著與之相對應的數據類型,而且 Java 層源碼被編譯為字節碼后保存了本地方法參數對應的類型,JVM 執行時可以根據不同的類型轉換成本地方法對應的類型,而本地方法定義的類型都為空類,主要作用是用來綁定對象,并且可以區分對象類型,在必要時刻通過指針轉換即可訪問對象或類元數據。

原文鏈接:http://blog.csdn.net/wangyangzhizhou/article/details/79576578

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美va免费精品高清在线 | 羞羞答答免费人成黄页在线观看国产 | 四虎永久免费地址ww417 | 欧美人妖大啪啪 | 99久久国语露脸精品国产 | 久久视热频国产这里只有精品23 | 四虎在线精品观看免费 | 国产精品永久免费自在线观看 | 黑人又大又硬又粗再深一点 | 日韩精品一区二区三区毛片 | 纲手被鸣人插 | 国产视频二区 | 男人在线影院 | 国产综合第一页 | japanese秘书丝袜 | 日本一道高清不卡免费 | 70岁多老妇人特黄a级毛片 | 免费特黄一级欧美大片在线看 | 福利一区二区在线观看 | 欧美粗黑巨大gay | 亚洲天堂2013 | 性欧美xxxxx高清 | 国产麻豆剧果冻传媒观看免费视频 | 四缺一小说 | 96免费精品视频在线 | 久久精品久久久 | 91色porny| 日韩成人精品在线 | 美女扒开屁股让男人进去 | 欧美在线播放成人免费 | 亚洲AV综合99一二三四区 | 国产成人小视频 | 日本一区二区不卡久久入口 | 日本不卡一区二区三区在线观看 | 欧美高清免费一级在线 | 亚洲午夜精品久久久久 | 国产激情一区二区三区成人91 | 红色播放器| 美国艳星lisann成人作品 | 欧美久久影院 | 91人人 |