那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用Java代碼調用

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-11 15:29 ? 次閱讀

我們前面在介紹 JDK 源碼 Object.class 類的時候,講過 getClass() 方法、hashCode()方法、clone() 方法,其中方法簽名如下:

public final native Class< ? > getClass();
public native int hashCode();
protected native Object clone() throws CloneNotSupportedException;

你敢說你沒用過這些方法?如果你用過,那你就是一定用過不是Java語言編寫的方法。
答案就是【native】關鍵詞,用此關鍵詞修飾的方法,多數情況就不是用Java實現的。
那么為什么要用 native 來修飾方法,這樣做有什么用?

1、JNI:Java Native Interface

在介紹 native 之前,我們先了解什么是 JNI。

一般情況下,我們完全可以使用 Java 語言編寫程序,但某些情況下,Java 可能會不滿足應用程序的需求,或者是不能更好的滿足需求,比如:

①、標準的 Java 類庫不支持應用程序平臺所需的平臺相關功能。

②、我們已經用另一種語言編寫了一個類庫,如何用Java代碼調用?

③、某些運行次數特別多的方法代碼,為了加快性能,我們需要用更接近硬件的語言(比如匯編)編寫。

上面這三種需求,其實說到底就是如何用 Java 代碼調用不同語言編寫的代碼。那么 JNI 應運而生了。

從Java 1.1開始,Java Native Interface (JNI)標準就成為java平臺的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計 的,但是它并不妨礙你使用其他語言,只要調用約定受支持就可以了。使用java與本地已編譯的代碼交互,通常會喪失平臺可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的,比如,使用一些舊的庫,與硬件、操作系統進行交互,或者為了提高程序的性能。JNI標準至少保證本地代碼能工作在任何Java 虛擬機實現下。

圖片
通過 JNI,我們就可以通過 Java 程序(代碼)調用到操作系統相關的技術實現的庫函數,從而與其他技術和系統交互,使用其他技術實現的系統的功能;同時其他技術和系統也可以通過 JNI 提供的相應原生接口開調用 Java 應用系統內部實現的功能。

在windows系統上,一般可執行的應用程序都是基于 native 的PE結構,windows上的 JVM 也是基于native結構實現的。Java應用體系都是構建于 JVM 之上。

圖片
可能有人會問,Java不是跨平臺的嗎?如果用 JNI,那么程序不就將失去跨平臺的優點?確實是這樣的。

JNI 的缺點:

①、程序不再跨平臺。要想跨平臺,必須在不同的系統環境下重新編譯本地語言部分。

②、程序不再是絕對安全的,本地代碼的不當使用可能導致整個程序崩潰。一個通用規則是,你應該讓本地方法集中在少數幾個類當中。這樣就降低了JAVA和C之間的耦合性。

目前來講使用 JNI 的缺點相對于優點還是可以接受的,可能后面隨著 Java 的技術發展,我們不在需要 JNI,但是目前 JDK 還是一直提供對 JNI 標準的支持。

3、用C語言編寫程序本地方法

上面講解了什么是 JNI,那么我們接下來就寫個例子,如何用 Java 代碼調用本地的 C 程序。

官方文檔如下:https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html

步驟如下:

①、編寫帶有 native 聲明的方法的java類,生成.java文件;(注意這里出現了 native 聲明的方法關鍵字)

②、使用 javac 命令編譯所編寫的java類,生成.class文件;

③、使用 javah -jni java類名 生成擴展名為 h 的頭文件,也即生成.h文件;

④、使用C/C++(或者其他編程語言)實現本地方法,創建.h文件的實現,也就是創建.cpp文件實現.h文件中的方法;

⑤、將C/C++編寫的文件生成動態連接庫,生成dll文件;

下面我們通過一個 HelloWorld 程序的調用來完成這幾個步驟。

注意:下面所有操作都是在所有操作都是在目錄:D:JNI 下進行的。

一、編寫帶有 native 聲明的方法的java類

public class HelloJNI {
    //native 關鍵字告訴 JVM 調用的是該方法在外部定義
    private native void helloJNI();

    static{
        System.loadLibrary("helloJNI");//載入本地庫
    }
    public static void main(String[] args) {
        HelloJNI jni = new HelloJNI();
        jni.helloJNI();
    }

}

用 native 聲明的方法表示告知 JVM 調用,該方法在外部定義,也就是我們會用 C 語言去實現。

System.loadLibrary("helloJNI");加載動態庫,參數 helloJNI 是動態庫的名字。我們可以這樣理解:程序中的方法 helloJNI() 在程序中沒有實現,但是我們下面要調用這個方法,怎么辦呢?我們就需要對這個方法進行初始化,所以用 static 代碼塊進行初始化。

這時候如果我們直接運行該程序,會報“A Java Exception has occurred”錯誤:

圖片
二、使用 javac 命令編譯所編寫的java類,生成.class文件

圖片
執行上述命令后,生成 HelloJNI.class 文件:

圖片
三、使用 javah -jni java類名 生成擴展名為 h 的頭文件

圖片
執行上述命令后,在 D:/JNI 目錄下多出了個 HelloJNI.h 文件:

圖片
四、使用C語言實現本地方法 如果不想安裝visual studio 的,我們需要在 windows平臺安裝 gcc。

安裝教程如下:http://blog.csdn.net/altland/article/details/63252757

注意安裝版本的選擇,根據系統是32位還是64位來選擇。64位點擊下載

安裝完成之后注意配置環境變量,在 cmd 中輸入 g++ -v,如果出現如下信息,則安裝配置完成:

圖片
接著輸入如下命令:

gcc -m64  -Wl,--add-stdcall-alias -I"C:Program FilesJavajdk1.8.0_152include" -I"C:Program FilesJavajdk1.8.0_152includeincludewin32" -shared -o helloJNI.dll helloJNI.c

-m64表示生成dll庫是64位的。后面的路徑表示本機安裝的JDK路徑。生成之后多了一個helloJNI.dll 文件

圖片
最后運行 HelloJNI:輸出 Hello JNI! 大功告成。

圖片

4、JNI調用C的流程圖

圖片
圖片引用自:https://www.cnblogs.com/Qian123/p/5702574.html

5、native關鍵字

通過上面介紹了那么多JNI的知識,終于到介紹本篇文章的主角——native 關鍵字了。相信大家看完上面的介紹,應該也是知道什么是 native 了吧。

native 用來修飾方法,用 native 聲明的方法表示告知 JVM 調用,該方法在外部定義,我們可以用任何語言去實現它。簡單地講,一個native Method就是一個 Java 調用非 Java 代碼的接口。

native 語法:

①、修飾方法的位置必須在返回類型之前,和其余的方法控制符前后關系不受限制。

②、不能用 abstract 修飾,也沒有方法體,也沒有左右大括號。

③、返回值可以是任意類型

我們在日常編程中看到native修飾的方法,只需要知道這個方法的作用是什么,至于別的就不用管了,操作系統會給我們實現。

6、小結

好了,這就是Java中對 native 關鍵詞的介紹。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2975

    瀏覽量

    105149
  • 程序
    +關注

    關注

    117

    文章

    3795

    瀏覽量

    81415
  • 代碼
    +關注

    關注

    30

    文章

    4827

    瀏覽量

    69055
  • 應用程序
    +關注

    關注

    38

    文章

    3292

    瀏覽量

    57917
收藏 人收藏

    評論

    相關推薦

    如何通過注解來優化我們的Java代碼

    Java注解可以說是我們編碼過程中最常用的。本篇文章將給大家介紹Java注解的概念、作用以及如何使用注解來提升代碼的可讀性和靈活性,并介紹如何通過注解來優化我們的Java
    的頭像 發表于 09-30 11:39 ?694次閱讀

    【視頻】應用開發第2期:JS+FA調用Java

    本期內容將會為大家介紹如何實現JS FA調用Java PA,并結合樣例代碼進行詳細說明。JS FA調用Java PA機制:https://d
    發表于 12-07 18:43

    何用java映射創建java對象和調用java對象呢

    java是一種解析語言,java程序是通過java虛擬機解析.class的方式運行起來。因此,java中就存在java映射的概念。下面介紹如
    發表于 04-11 14:43

    何用java映射創建java對象和調用java對象的方法

    java是一種解析語言,java程序是通過java虛擬機解析.class的方式運行起來。因此,java中就存在java映射的概念。一、首先我
    發表于 07-28 16:11

    JAVA版聊天軟件源代碼

    JAVA版聊天軟件源代碼 一款用JAVA制作開發的小型聊天軟件,里面附有安裝程序和JAVA代碼。.rar
    發表于 03-11 14:21 ?0次下載

    何用Word調用Protel For DOS繪制的圖形

    何用Word調用Protel For DOS繪制的圖形 撰寫科技文章時,常常需要插入一些電路原理圖,如果這些原理圖用Word自帶的畫圖工具繪制
    發表于 03-09 13:40 ?1424次閱讀

    Java學習路線教程之Java新手必須學習那21個技術點詳細資料說明

    Java調用本地接口方法,一般用于C/C++代碼調用。需要注意的是在java中加載so/dll文件的路徑問題,本身
    發表于 12-19 15:23 ?19次下載

    Java調用window的matlab遇到的問題和解決方案

    Java調用window的matlab遇到的問題和解決方案
    的頭像 發表于 06-20 09:32 ?3384次閱讀
    <b class='flag-5'>Java</b>:<b class='flag-5'>調用</b>window的matlab遇到的問題和解決方案

    Java異常的習題和代碼分析

    Java異常的習題和代碼分析
    發表于 07-08 14:54 ?5次下載
    <b class='flag-5'>Java</b>異常的習題和<b class='flag-5'>代碼</b>分析

    HarmonyOS如何自動生成JS FA調用Java PA的模板代碼

    JS UI框架提供了JS FA(Feature Ability)調用Java PA(Particle Ability)的機制,該機制提供了一種通道來傳遞方法調用、處理數據返回以及訂閱事件上報。 在往
    的頭像 發表于 09-28 10:09 ?2173次閱讀

    Java方法中調用Lua function

    Java先載入login.lua腳本并編譯,然后再獲取指定名稱的函數,無參的直接使用call()方法調用,帶參的需要通過invoke(LuaValue[])傳入參數表。
    的頭像 發表于 09-07 10:47 ?1461次閱讀

    java上位機開發(c庫調用)

    所有的動態語言,包括在java在內,一般都會提供一個調用c庫的方法。java語言的出現是在上個世紀90年代,而c/c++出現的時間要更早 一點,大約提前了20多年,所以在這過程當中積累了很多的資源
    發表于 05-09 10:00 ?0次下載
    <b class='flag-5'>java</b>上位機開發(c庫<b class='flag-5'>調用</b>)

    何用Java播放聲音

    在本篇文章中,我們將學習如何用Java播放音樂,Java 聲音 API 的設計是為了流暢和連續地播放聲音,甚至是很長的聲音。我們將使用 Java 提供的 Clip 和 SourceDa
    的頭像 發表于 10-09 10:56 ?3492次閱讀

    何用Rust通過JNI和Java進行交互

    近期工作中有Rust和Java互相調用需求,這篇文章主要介紹如何用Rust通過JNI和Java進行交互,還有記錄一下開發過程中遇到的一些坑。
    的頭像 發表于 10-17 11:41 ?838次閱讀

    shell調用java并返回執行結果

    在Shell腳本中調用Java程序并獲取執行結果,可以通過以下步驟實現: 編寫Java程序:首先,你需要編寫一個Java程序,包含你想要執行的功能。確保你的
    的頭像 發表于 11-08 10:32 ?1856次閱讀
    利来网上娱乐| 星河百家乐现金网| 大发888全球顶级游戏平台| 香港百家乐官网玩| 大发888代理| 澳门百家乐官网娱乐场开户注册 | 百家乐怎么发牌| 澳门百家乐官网大小| 百家乐庄闲必胜手段| 兴山县| 百家乐娱乐送白菜| 百家乐官网赌博现金网| 顶级赌场是骗人的吗| 百家乐如何投注法| 百家乐官网补牌规律| 多台百家乐的玩法技巧和规则| 百家乐官网变牌器批发| 大发888娱乐场下载 制度| 百家乐娱乐城彩金| 百家乐官网视频打麻将| 百家乐导航| 做生意买车白色风水| 澳门百家乐官网赢钱| 百家乐破解仪恒达| 百家乐官网打水论坛| 在线博弈游戏| 八大胜百家乐娱乐城| 百家乐官网公式论坛| 娱乐城开户| 百家乐透视牌靴| 百家乐官网真人游戏攻略| 金龙博彩网| 悍马百家乐的玩法技巧和规则| 福布斯百家乐官网的玩法技巧和规则| 英吉沙县| 新全讯网2| 大发百家乐游戏| 太阳城百家乐官网出千技术| 德州扑克专业版| 百家乐关台| 米泉市|