网易首页 > 网易号 > 正文 申请入驻

JDK最底层源码,掌握native用法!

0
分享至

❝ ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者,CSDN博客专家,华为云享专家,掘金年度人气作者 ❤️技术活,该赏 ❤️点赞 收藏 ⭐再看,养成习惯 ❞

场景

有探索欲的同学,应该会跟我一样,在看JDK源码时,跟到最后,会出现native方法,类似下面这个方法


* Gets the platform defined TimeZone ID.
private static native String getSystemTimeZoneID(String javaHome);

看到这个native ,说明已经挖到核心了,到了这一步,还是不清楚是怎么获取系统的默认时区的,那怎么办,JDK代码只能跟到这里。

转战OpenJDK,源码下载方式:https://gitee.com/mirrors/openjdk

什么是native

native是一个计算机函数,一个Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++。

native的源码怎么看呢

以**private static native String getSystemTimeZoneID(String javaHome)**为例

getSystemTimeZoneID方法所在的package java.util.TimeZone;

如图所示,找到TimeZone.c下的getSystemTimeZoneID方法

if (java_home == NULL)
return NULL;

java_home_dir = JNU_GetStringPlatformChars(env, java_home, 0);
if (java_home_dir == NULL)
return NULL;

if (country != NULL) {
cname = JNU_GetStringPlatformChars(env, country, 0);
/* ignore error cases for cname */
} else {
cname = NULL;
}

/*
* Invoke platform dependent mapping function
*/
javaTZ = findJavaTZ_md(java_home_dir, cname);

free((void *)java_home_dir);
if (cname != NULL) {
free((void *)cname);
}

if (javaTZ != NULL) {
jstring jstrJavaTZ = JNU_NewStringPlatform(env, javaTZ);
free((void *)javaTZ);
return jstrJavaTZ;
}
return NULL;
}

重点:调用不同平台相关的映射函数


* Invoke platform dependent mapping function
javaTZ = findJavaTZ_md(java_home_dir, cname);

去查找findJavaTZ_md方法时,发现存在分别在solaris和windows两个目录下。

查了下这两个目录的差别:

因为OpenJDK里,Java标准库和部分工具的源码repo(jdk目录)里,BSD和Linux的平台相关源码都是在solaris目录里的。
原本Sun JDK的源码里平台相关的目录就是从solaris和windows这两个目录开始的,后来Unix系的平台相关代码全都放在solaris目录下了,共用大部分代码。

作者:RednaxelaFX
链接:https://www.zhihu.com/question/58982441/answer/170264788
来源:知乎

「简单的理解就是:」

「window系统下,使用windows目录下编译的JDK代码」

「unix相关的平台下,使用solaris目录下编译的JDK代码」

了解不同系统下findJavaTZ_md方法执行 windows系统
* Detects the platform time zone which maps to a Java time zone ID.
char *findJavaTZ_md(const char *java_home_dir, const char *country)
char winZoneName[MAX_ZONE_CHAR];
char winMapID[MAX_MAPID_LENGTH];
char *std_timezone = NULL;
int result;

winMapID[0] = 0;
result = getWinTimeZone(winZoneName, winMapID);

if (result != VALUE_UNKNOWN) {
if (result == VALUE_GMTOFFSET) {
std_timezone = _strdup(winZoneName);
} else {
std_timezone = matchJavaTZ(java_home_dir, result,
winZoneName, winMapID, country);
}
}

return std_timezone;
}

注释写得很清楚,获取“Time Zones”注册表中的当前时区


* Gets the current time zone entry in the "Time Zones" registry.
static int getWinTimeZone(char *winZoneName, char *winMapID)

时区的设置方式:

那时区上的选择值是从哪取到的,上面有说了,是在注册表中取值

打开注册表 :Regedit-->

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\
unix相关的平台

findJavaTz_md()方法的注释上写得很清楚了:将平台时区ID映射为Java时区ID


* findJavaTZ_md() maps platform time zone ID to Java time zone ID
* using /lib/tzmappings. If the TZ value is not found, it
* trys some libc implementation dependent mappings. If it still
* can't map to a Java time zone ID, it falls back to the GMT+/-hh:mm
* form. `country', which can be null, is not used for UNIX platforms.
/*ARGSUSED1*/
char *
findJavaTZ_md(const char *java_home_dir, const char *country)
char *tz;
char *javatz = NULL;
char *freetz = NULL;

tz = getenv("TZ");

#ifdef __linux__
if (tz == NULL) {
#else
#ifdef __solaris__
if (tz == NULL || *tz == '\0') {
#endif
#endif
tz = getPlatformTimeZoneID();
freetz = tz;
}

/*
* Remove any preceding ':'
*/
if (tz != NULL && *tz == ':') {
tz++;
}

#ifdef __solaris__
if (strcmp(tz, "localtime") == 0) {
tz = getSolarisDefaultZoneID();
freetz = tz;
}
#endif

if (tz != NULL) {
#ifdef __linux__
/*
* Ignore "posix/" prefix.
*/
if (strncmp(tz, "posix/", 6) == 0) {
tz += 6;
}
#endif
javatz = strdup(tz);
if (freetz != NULL) {
free((void *) freetz);
}
}
return javatz;
}

步骤:

1、使用< Java home>/lib/tzmappings,。如果没有找到"TZ"变量,就进行第2步

2、 tz = getPlatformTimeZoneID(); 执行Linux特定的映射,如果找到,返回一个时区ID,否则返回null

【Linux】Centos7修改系统时区timezone方式:

timedatectl
如图

修改时区

timedatectl set-timezone Asia/Shanghai
如图

3、对比/etc/localtime与"/usr/share/zoneinfo目录下的文件,如果一致,就返回时区ID,没有则到第4步

4、返回到GMT

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
最后的疯狂!扮成美国队长强闯中国使馆的韩国人果然和尹锡悦有关

最后的疯狂!扮成美国队长强闯中国使馆的韩国人果然和尹锡悦有关

娱乐的宅急便
2025-02-16 12:01:58
这可能就是大部分散户炒股赚不了钱的原因,只为回本!

这可能就是大部分散户炒股赚不了钱的原因,只为回本!

人情皆文史
2025-02-17 02:37:02
“我再也不用苹果耳机了” 男子警告无线耳机有辐射,拿出仪器一测,结果亮了

“我再也不用苹果耳机了” 男子警告无线耳机有辐射,拿出仪器一测,结果亮了

北美省钱快报
2025-02-14 08:46:07
春晚“曝光”了一条“北极鲶鱼”?

春晚“曝光”了一条“北极鲶鱼”?

吃瓜体
2025-02-06 22:42:28
一觉睡醒!梁文锋的发言又火了!

一觉睡醒!梁文锋的发言又火了!

玲子日记
2025-02-15 09:55:56
解放军凌晨发声!“台独”大头目被拿下;蔡英文“立大功”了

解放军凌晨发声!“台独”大头目被拿下;蔡英文“立大功”了

听风者说
2025-02-13 11:17:50
U20亚洲杯,中国5-2吉尔吉斯斯坦,孙继海赛后点评

U20亚洲杯,中国5-2吉尔吉斯斯坦,孙继海赛后点评

生活新鲜市
2025-02-16 11:58:00
女子在泰国浮潜脑死亡,两名法国人或有重要线索!这声音到底是什么?

女子在泰国浮潜脑死亡,两名法国人或有重要线索!这声音到底是什么?

都市快报橙柿互动
2025-02-16 21:33:07
卖yin、吸du、欺诈:这个所谓的“太阳花女神”是如何堕落的?

卖yin、吸du、欺诈:这个所谓的“太阳花女神”是如何堕落的?

阿胡
2025-02-10 12:33:21
8天刷31场《哪吒2》!合肥女孩回应质疑

8天刷31场《哪吒2》!合肥女孩回应质疑

AHTV第一时间
2025-02-16 20:45:57
你是怎么发现儿子早恋这个秘密的,网友们的回复还真是五花八门

你是怎么发现儿子早恋这个秘密的,网友们的回复还真是五花八门

娱乐圈人物大赏
2025-02-12 01:58:21
39岁卡友刘俊平猝死,妻女哭成泪人,家庭状况曝光,丧事成大难题

39岁卡友刘俊平猝死,妻女哭成泪人,家庭状况曝光,丧事成大难题

阿凫爱吐槽
2025-02-16 12:37:41
以前他可是天王啊!怎么去大山里发展了?简陋的舞台让网友很心疼

以前他可是天王啊!怎么去大山里发展了?简陋的舞台让网友很心疼

祝晓塬
2025-02-15 20:21:14
德国防长声称“不可接受”,法国外长反对“强加于人”,万斯慕安会上批欧洲引发强烈反弹

德国防长声称“不可接受”,法国外长反对“强加于人”,万斯慕安会上批欧洲引发强烈反弹

环球网资讯
2025-02-17 07:05:08
男领导趁出差对女下属图谋不轨?民警抓现行

男领导趁出差对女下属图谋不轨?民警抓现行

8099999街头巷尾
2025-02-15 20:10:36
惨烈!广西南宁一大桥发生车祸多人躺地,原因疑曝光,目击者发声

惨烈!广西南宁一大桥发生车祸多人躺地,原因疑曝光,目击者发声

鋭娱之乐
2025-02-16 22:07:48
丰田亚洲龙2.0混动实测:一箱油跑1000公里,养车成本比电车还低

丰田亚洲龙2.0混动实测:一箱油跑1000公里,养车成本比电车还低

沙雕小琳琳
2025-02-16 19:12:35
日本专家:中日战争一旦爆发,日军将对中国军舰发起“三重打击”

日本专家:中日战争一旦爆发,日军将对中国军舰发起“三重打击”

爱竞彩的小周
2025-02-16 19:00:09
裤衩姐相比胖东来100万的赔偿,她更担心下面三点:

裤衩姐相比胖东来100万的赔偿,她更担心下面三点:

猫小狸同学
2025-02-16 19:20:03
韩国女演员金赛纶16日确认于首尔家中死亡,身世悲惨,命途多坎坷

韩国女演员金赛纶16日确认于首尔家中死亡,身世悲惨,命途多坎坷

晓徙历史
2025-02-17 07:47:44
2025-02-17 10:08:49
JavaEdge incentive-icons
JavaEdge
Java 技术
400文章数 450关注度
往期回顾 全部

科技要闻

官宣!百度搜索将接入DeepSeek

头条要闻

牛弹琴:特朗普发一句话 让美国乃至世界倒吸一口凉气

头条要闻

牛弹琴:特朗普发一句话 让美国乃至世界倒吸一口凉气

体育要闻

麦克朗三夺扣篮王:历史首人12扣8次满分

娱乐要闻

琼瑶去世两个月后,林婉珍也离开了

财经要闻

"王炸组合"来了!DeepSeek朋友圈挤爆了

汽车要闻

或全系搭华为乾崑智驾 岚图梦想家新款车型将上市

态度原创

艺术
本地
旅游
时尚
健康

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

本地新闻

非遗版春节|古法滚元宵,年味儿一口爆浆

旅游要闻

当南方热衷造雪

春天如何优雅地露袜子?

抑郁症患者称好的“乌托邦”宝地

无障碍浏览 进入关怀版