欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java中native方法的使用

 更新時(shí)間:2020年09月16日 11:38:18   作者:咖啡味的茶  
native是與C++聯(lián)合開發(fā)的時(shí)候用的!使用native關(guān)鍵字說(shuō)明這個(gè)方法是原生函數(shù),也就是這個(gè)方法是用C/C++語(yǔ)言實(shí)現(xiàn)的,并且被編譯成了DLL,由java去調(diào)用。本文給大家介紹java 中native方法使用,感興趣的朋友一起看看吧

今天在網(wǎng)上學(xué)習(xí)時(shí)碰到有關(guān)于 native修飾符所修飾的方法,上網(wǎng)查了查,覺(jué)得很有意思記錄一下

在這里插入圖片描述

1、native簡(jiǎn)介

簡(jiǎn)單地講,一個(gè)Native Method就是一個(gè)java調(diào)用非java代碼的接口。一個(gè)Native Method是這樣一個(gè)java的方法:該方法的實(shí)現(xiàn)由非java語(yǔ)言實(shí)現(xiàn),比如C。這個(gè)特征并非java所特有,很多其它的編程語(yǔ)言都有這一機(jī)制,比如在C++中,你可以用extern “C”告知C++編譯器去調(diào)用一個(gè)C的函數(shù)。

native是與C++聯(lián)合開發(fā)的時(shí)候用的!使用native關(guān)鍵字說(shuō)明這個(gè)方法是原生函數(shù),也就是這個(gè)方法是用C/C++語(yǔ)言實(shí)現(xiàn)的,并且被編譯成了DLL,由java去調(diào)用。 這些函數(shù)的實(shí)現(xiàn)體在DLL中,JDK的源代碼中并不包含,你應(yīng)該是看不到的。對(duì)于不同的平臺(tái)它們也是不同的。這也是java的底層機(jī)制,實(shí)際上java就是在不同的平臺(tái)上調(diào)用不同的native方法實(shí)現(xiàn)對(duì)操作系統(tǒng)的訪問(wèn)的??偠灾?/p>

native 是用做java 和其他語(yǔ)言(如c++)進(jìn)行協(xié)作時(shí)使用的,也就是native 后的函數(shù)的實(shí)現(xiàn)不是用java寫的。
既然都不是java,那就別管它的源代碼了,我們只需要知道這個(gè)方法已經(jīng)被實(shí)現(xiàn)即可。
native的意思就是通知操作系統(tǒng), 這個(gè)函數(shù)你必須給我實(shí)現(xiàn),因?yàn)槲乙褂谩?所以native關(guān)鍵字的函數(shù)都是操作系統(tǒng)實(shí)現(xiàn)的, java只能調(diào)用。
java是跨平臺(tái)的語(yǔ)言,既然是跨了平臺(tái),所付出的代價(jià)就是犧牲一些對(duì)底層的控制,而java要實(shí)現(xiàn)對(duì)底層的控制,就需要一些其他語(yǔ)言的幫助,這個(gè)就是native的作用了。

2、native用法

1.編寫帶有native聲明的方法的Java類(java文件)
2.使用javac命令編譯編寫的Java類(class文件)如:javac NativeTest.java
3.使用javah -jni ****來(lái)生成后綴名為.h的頭文件(.h的文件) 如:javah -jni NativeTest
4.使用其他語(yǔ)言(C、C++)實(shí)現(xiàn)本地方法
5.將本地方法編寫的文件生成動(dòng)態(tài)鏈接庫(kù)(dll文件)

注意:javac NativeTest.java 沒(méi)有帶包名,因?yàn)槲业腘ativeTest.java不在任何包(package)中。

示例如下:

public class NativeTest {
 public native void hello(String name);
 static{
  System.loadLibrary("wittdong");//wittdong和生成動(dòng)態(tài)鏈接庫(kù)的 wittdong.dll名字一致
 }
 public static void main(String[] args){
  new NativeTest().hello("jni");
 }
}

在這里插入圖片描述

打開 javah 編譯出 后綴名為 .h 的文件圖:

在這里插入圖片描述

4、用C語(yǔ)言實(shí)現(xiàn)本地方法(hello),生成 NativeTestImpl.c 格式文件

#include <jni.h>
#include “NativeTest.h”
#include <stdio.h>
JNIEXPORT void JNICALL Java_NativeTest_hello(JNIEnv *env,jobject obj, jstring name){
printf(“hello world”);
}

5、生成動(dòng)態(tài)鏈接庫(kù)

一種方式:cl -I %java_home%\include -I%java_home%\include\win32 -LD NativeTestImpl.c -Fe wittdong.dll

另一種方式:用VC++6.0編譯一下在debug文件夾中就生成好了dll文件。

將dll放到生成.h的那一級(jí)文件夾中,就可以進(jìn)行native本地方法調(diào)用。在Eclipse執(zhí)行時(shí),需把dll文件拷貝到C:\Windows\System32

3、補(bǔ)充資料

c語(yǔ)言中.c和.h文件關(guān)系以及區(qū)別:

本質(zhì)上沒(méi)有任何區(qū)別。 只不過(guò)一般:.h文件是頭文件,內(nèi)含函數(shù)聲明、宏定義、結(jié)構(gòu)體定義等內(nèi)容

.c文件是程序文件,內(nèi)含函數(shù)實(shí)現(xiàn),變量定義等內(nèi)容。而且是什么后綴也沒(méi)有關(guān)系,只不過(guò)編譯器會(huì)默認(rèn)對(duì)某些后綴的文件采取某些動(dòng)作。你可以強(qiáng)制編譯器把任何后綴的文件都當(dāng)作c文件來(lái)編。

這樣分開寫成兩個(gè)文件是一個(gè)良好的編程風(fēng)格。

而且,比方說(shuō) 我在aaa.h里定義了一個(gè)函數(shù)的聲明,然后我在aaa.h的同一個(gè)目錄下建立aaa.c ,aaa.c里定義了這個(gè)函數(shù)的實(shí)現(xiàn),然后是在main函數(shù)所在.c文件里#include這個(gè)aaa.h 然后我就可以使用這個(gè)函數(shù)了。 main在運(yùn)行時(shí)就會(huì)找到這個(gè)定義了這個(gè)函數(shù)的aaa.c文件。

這是因?yàn)椋?/p>

main函數(shù)為標(biāo)準(zhǔn)C/C++的程序入口,編譯器會(huì)先找到該函數(shù)所在的文件。

假定編譯程序編譯myproj.c(其中含main())時(shí),發(fā)現(xiàn)它include了mylib.h(其中聲明了函數(shù)void test()),那么此時(shí)編譯器將按照事先設(shè)定的路徑(Include路徑列表及代碼文件所在的路徑)查找與之同名的實(shí)現(xiàn)文件(擴(kuò)展名為.cpp或.c,此例中為mylib.c)(應(yīng)該是跟java的import一樣),如果找到該文件,并在其中找到該函數(shù)(此例中為void test())的實(shí)現(xiàn)代碼,則繼續(xù)編譯;如果在指定目錄找不到實(shí)現(xiàn)文件,或者在該文件及后續(xù)的各include文件中未找到實(shí)現(xiàn)代碼,則返回一個(gè)編譯錯(cuò)誤.其實(shí)include的過(guò)程完全可以"看成"是一個(gè)文件拼接的過(guò)程,將聲明和實(shí)現(xiàn)分別寫在頭文件及C文件中,或者將二者同時(shí)寫在頭文件中,理論上沒(méi)有本質(zhì)的區(qū)別。

到此這篇關(guān)于詳解Java中native方法的使用的文章就介紹到這了,更多相關(guān)java 中native方法使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Trace?在多線程異步體系下傳遞流程解析

    Trace?在多線程異步體系下傳遞流程解析

    這篇文章主要為大家介紹了Trace?在多線程異步體系下傳遞流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java中的final關(guān)鍵字詳細(xì)介紹

    Java中的final關(guān)鍵字詳細(xì)介紹

    這篇文章主要介紹了Java中的final關(guān)鍵字,有需要的朋友可以參考一下
    2014-01-01
  • 手把手教你使用IDEA創(chuàng)建多模塊(maven)項(xiàng)目

    手把手教你使用IDEA創(chuàng)建多模塊(maven)項(xiàng)目

    這篇文章主要給大家介紹了關(guān)于如何使用IDEA創(chuàng)建多模塊(maven)項(xiàng)目的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java中BEAN與EJB的區(qū)別淺析

    Java中BEAN與EJB的區(qū)別淺析

    這篇文章主要介紹了Java中BEAN與EJB的區(qū)別淺析,本文總結(jié)了它們之間的不同之處,需要的朋友可以參考下
    2015-03-03
  • Springboot為什么加載不上application.yml的配置文件

    Springboot為什么加載不上application.yml的配置文件

    這篇文章主要介紹了Springboot為什么加載不上application.yml的配置文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • MyBatis的嵌套查詢解析

    MyBatis的嵌套查詢解析

    本篇文章主要介紹了MyBatis的嵌套查詢解析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Spring?Cloud?OAuth2實(shí)現(xiàn)自定義token返回格式

    Spring?Cloud?OAuth2實(shí)現(xiàn)自定義token返回格式

    Spring?Security?OAuth的token返回格式都是默認(rèn)的,但是往往這個(gè)格式是不適配系統(tǒng)。本文將用一個(gè)接口優(yōu)雅的實(shí)現(xiàn)?Spring?Cloud?OAuth2?自定義token返回格式,需要的可以參考一下
    2022-06-06
  • Java ThreadLocal類應(yīng)用實(shí)戰(zhàn)案例分析

    Java ThreadLocal類應(yīng)用實(shí)戰(zhàn)案例分析

    這篇文章主要介紹了Java ThreadLocal類應(yīng)用,結(jié)合具體案例形式分析了java ThreadLocal類的功能、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • Java跨域問(wèn)題的幾種后端解決方式舉例詳解

    Java跨域問(wèn)題的幾種后端解決方式舉例詳解

    跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript實(shí)施的安全限制,這篇文章主要給大家介紹了關(guān)于Java跨域問(wèn)題的幾種后端解決方式的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • JAVA實(shí)現(xiàn)FTP斷點(diǎn)上傳的方法

    JAVA實(shí)現(xiàn)FTP斷點(diǎn)上傳的方法

    這篇文章主要介紹了JAVA實(shí)現(xiàn)FTP斷點(diǎn)上傳的方法,涉及java使用FTP實(shí)現(xiàn)文件傳輸?shù)南嚓P(guān)技巧,需要的朋友可以參考下
    2015-06-06

最新評(píng)論