java中的native方法

一. 什么是Native Method

???簡單地講,一個Native Method就是一個java調用非java代碼的接口。一個Native Method是這樣一個java的方法:該方法的實現由非java語言實現,比如C。這個特征并非java所特有,很多其它的編程語言都有這一機制,比如在C++中,你可以用extern "C"告知C++編譯器去調用一個C的函數。

?? 標識符native可以與所有其它的java標識符連用,但是abstract除外。這是合理的,因為native暗示這些方法是有實現體的,只不過這些實現體是非java的,但是abstract卻顯然的指明這些方法無實現體。native與其它java標識符連用時,其意義同非Native Method并無差別,比如native static表明這個方法可以在不產生類的實例時直接調用,這非常方便,比如當你想用一個native method去調用一個C的類庫時。上面的第三個方法用到了native synchronized,JVM在進入這個方法的實現體之前會執行同步鎖機制(就像java的多線程。)

二.為什么要使用Native Method
???java使用起來非常方便,然而有些層次的任務用java實現起來不容易,或者我們對程序的效率很在意時,問題就來了。
???與java環境外交互:
???有時java應用需要與java外面的環境交互。這是本地方法存在的主要原因,你可以想想java需要與一些底層系統如操作系統或某些硬件交換信息時的情況。本地方法正是這樣一種交流機制:它為我們提供了一個非常簡潔的接口,而且我們無需去了解java應用之外的繁瑣的細節。
???與操作系統交互:
???JVM支持著java語言本身和運行時庫,它是java程序賴以生存的平臺,它由一個解釋器(解釋字節碼)和一些連接到本地代碼的庫組成。然而不管怎 樣,它畢竟不是一個完整的系統,它經常依賴于一些底層(underneath在下面的)系統的支持。這些底層系統常常是強大的操作系統。通過使用本地方法,我們得以用java實現了jre的與底層系統的交互,甚至JVM的一些部分就是用C寫的,還有,如果我們要使用一些java語言本身沒有提供封裝的操作系統的特性時,我們也需要使用本地方法。
????Sun's Java
????Sun的解釋器是用C實現的,這使得它能像一些普通的C一樣與外部交互。jre大部分是用java實現的,它也通過一些本地方法與外界交互。例如:類java.lang.Thread 的 setPriority()方法是用java實現的,但是它實現調用的是該類里的本地方法setPriority0()。這個本地方法是用C實現的,并被植入JVM內部,在Windows 95的平臺上,這個本地方法最終將調用Win32 SetPriority() API。這是一個本地方法的具體實現由JVM直接提供,更多的情況是本地方法由外部的動態鏈接庫(external dynamic link library)提供,然后被JVM調用。

三.JVM怎樣使Native Method跑起來:
????我們知道,當一個類第一次被使用到時,這個類的字節碼會被加載到內存,并且只會回載一次。在這個被加載的字節碼的入口維持著一個該類所有方法描述符的list,這些方法描述符包含這樣一些信息:方法代碼存于何處,它有哪些參數,方法的描述符(public之類)等等。
????如果一個方法描述符內有native,這個描述符塊將有一個指向該方法的實現的指針。這些實現在一些DLL文件內,但是它們會被操作系統加載到java程序的地址空間。當一個帶有本地方法的類被加載時,其相關的DLL并未被加載,因此指向方法實現的指針并不會被設置。當本地方法被調用之前,這些DLL才會被加載,這是通過調用java.system.loadLibrary()實現的。
???
???最后需要提示的是,使用本地方法是有開銷的,它喪失了java的很多好處。如果別無選擇,我們可以選擇使用本地方法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451816.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451816.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451816.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

17--合并兩個有序數組

文章目錄1.問題描述2.代碼實現1.問題描述 給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合并到 nums1 中,使 nums1 成為一個有序數組。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。 你可以假設 nums1 有足夠的空間(空間…

Maven 添加本地 jar 包、添加依賴 jar 文件到本地 Maven 倉庫、引用本地 jar

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 把要用的jar放在固定位置: 2.打開CMD,進入到libs文件夾: 3.運行如下命令: mvn install:install-…

如鵬網 net高級技術 第二章 委托和事件(復習)

委托 委托是一種數據類型,可以聲明委托類型變量。 委托是一種可以指向方法的數據類型。 聲明委托的方式:delegate返回值類型 委托類型名(參數)   比如  delegate void MyDel(int n) 注意這里的除了前面的delegate,剩下部分和聲明一個函數一樣&#…

黃文俊:Serverless小程序后端技術分享

歡迎大家前往騰訊云社區,獲取更多騰訊海量技術實踐干貨哦~ 黃文俊,現任騰訊云SCF無服務器云函數高級產品經理,多年企業級系統開發和架構工作經驗,對企業級存儲、容器平臺、微服務架構、無服務器計算等領域均有涉獵。今天講的是怎么…

最少編碼原則

本文作者是一位資深軟件工程師,他根據多年的編程經驗,把自己的觀點組織整理成本文,希望能給大家一點啟發。 “最少編碼原則”并不是說寫的代碼少到令意思表達不清楚。其實在很多情況下,可以只寫幾行代碼就能執行相同的邏輯&#x…

什么是標記接口

標識接口的作用 標識接口是沒有任何方法和屬性的接口。標識接口不對實現它的類有任何語義上的要求,它僅僅表明實現它的類屬于一個特定的類型。 標接口在Java語言中有一些很著名的應用,比如java.io.Serializable和java.rmi.Remote等接口便是標識接口。標識…

18--兩數之和 II - 輸入有序數組

文章目錄1.問題描述2.解題代碼1.問題描述 給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等于目標數。 函數應該返回這兩個下標值 index1 和 index2,其中 index1 必須小于 index2。 說明: 返回的下標值(index1 和 index2&a…

阿里巴巴 連接池 druid 的使用、maven依賴

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. Druid是一個JDBC組件,它包括三部分: DruidDriver 代理Driver,能夠提供基于Filter-…

Oracle數據庫(二)—— 基本的SQL SELECT語句

(一)SQL語句分為一下三種類型 DML:Date Manipulation Language 數據操縱語言DDL:Data Definition Language 數據定義語言DCL:Data Control Language 數據控制語言DML:用于查詢與修改數據記錄 包括如下SQL語句&#xff…

簡單 3 步實現高效編程

本文的內容可能部分開發者已經了解,并且已經按照這些方法實施了。但本文還是想強調這些方法,因為這些簡單的方法可以讓你的工作更加高效。要想實現高效編程,最主要的是集中注意力,但這往往也是比較難以實現的,因為你在…

bootstrap table footerFormatter用法 統計列求和 sum、average等

其實上一篇blog里已經貼了代碼,簡單解釋一下吧: 1、showFooter: true,很重要,設置footer顯示: $(cur_table).bootstrapTable({url: /etestpaper/getPaperQType,method: get,queryParams: {strParentID: parentid},ajaxOptions: {s…

19--兩數之和

文章目錄1.題目要求2.代碼詳情1.題目要求 2.代碼詳情 java:暴力求解法hashmap法 class Solution {// 方法一&#xff1a;暴力求解法// public int[] twoSum(int[] nums, int target) {// int n nums.length;// for (int i0; i<n; i){// for (int ji1; j…

單利設計模式

單利設計模式 A&#xff1a;保證對象在內存中只有一個。 B&#xff1a;如何保證&#xff1f; **不能讓其他類來創建對象。 **本類中要創建一個本類對象。 **對外提供公共的訪問。 C&#xff1a;步驟 我們的類是Student **private Student(){} **Student s new Student(); **p…

MVC表示層框架——Velocity技術

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Velocity&#xff0c;名稱字面翻譯為&#xff1a;速度、速率、迅速&#xff0c;用在Web開發里&#xff0c;用過的人可能不多&#xff0c…

redis的配置文件

redis的配置文件 之前在實習的時候才開始接觸redis&#xff0c;隨著對redis的理解加深&#xff0c;才慢慢明白它的強大&#xff0c;也逐漸對他的配置有了一定的了解。下面就分享給大家&#xff0c;以便日后查看。 位置 redis的配置文件名為redis.conf在它的安裝目錄下。 參數說…

你的代碼(軟件)安全嗎?【信息圖】

2011年安全事件層出不窮&#xff0c;幾乎可以稱為“黑客年”。以前黑客通常是利用程序漏洞來造成破壞&#xff0c;令網站陷入尷尬的境地&#xff0c;但如今他們卻是為了竊取數據、IP地址&#xff0c;或者通過在網站中植入木馬將惡意軟件安裝到訪客的電腦里&#xff0c;更有甚者…

20--兩個數組的交集

文章目錄1.問題描述2.代碼詳情1.問題描述 給定兩個數組&#xff0c;編寫一個函數來計算它們的交集。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 輸出&#xff1a;[2] 示例 2&#xff1a; 輸入&#xff1a;nums1 [4,9,5], nums2 [9,4,9,8,4] 輸…

MD5密碼加密

using System; using System.Security.Cryptography; using System.Text; namespace DimoNetwork.Common.DEncrypt { public enum MD5ResultMode : byte { Strong 0, Weak 1 } /// /// 在應用程序中定義用于單向加密文本的方法 /// public class TextEncrypt { private TextE…

跳出IT運維怪圈 看南方報業如何主動出擊

雖說世界上沒有一勞永逸的事情&#xff0c;不過借助某些方案&#xff0c;IT運維倒可做到事半功倍。近日&#xff0c;南方報業傳媒集團采用新華三智動遠程運維服務解決方案&#xff0c;利用7*24級別安仔的桌面服務&#xff0c;實現IT運維智能化、自動化管理&#xff0c;有效保障…