溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java中的Native方法是什么

發(fā)布時(shí)間:2021-12-22 20:21:28 來(lái)源:億速云 閱讀:255 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Java中的Native方法是什么,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

以下是java中如何使用native方法的基本語(yǔ)法:

[ public / protected / private] native [return-type] methodName ();

上面的語(yǔ)法顯示了如何在java中聲明本機(jī)方法。與普通方法一樣,它需要定義一個(gè)訪問(wèn)修飾符,后跟一個(gè)native關(guān)鍵字,后跟方法的返回類(lèi)型,最后是方法名稱(chēng),如果需要,還需要指定輸入?yún)?shù)。

1.Native方法在Java中如何工作?

它可以定義為那些用java以外的語(yǔ)言(如C/C++)實(shí)現(xiàn)的方法。使用這些方法背后的總體思路可能是利用C/C++中提供的高性能或內(nèi)存管理。

為了支持用其他語(yǔ)言編寫(xiě)的方法,Java提供了一個(gè)稱(chēng)為Java Native Interface的接口,它充當(dāng)Java和其他語(yǔ)言之間的中介。使用JNI的動(dòng)機(jī)來(lái)自這樣一個(gè)事實(shí):它可以提供代碼重用性和高性能。需要注意的是,用C/C++等其他語(yǔ)言編寫(xiě)的代碼是不可移植的。

以下是Java本機(jī)native接口的主要組件:

  • javah:這是java開(kāi)發(fā)工具包中提供的一個(gè)工具,它從包含native方法的現(xiàn)有java文件java類(lèi)中創(chuàng)建與C兼容的頭文件。

  • h:這是Java開(kāi)發(fā)工具包中提供的基于C/C++的頭文件,其功能是提供Java數(shù)據(jù)類(lèi)型和native數(shù)據(jù)類(lèi)型之間的映射。上面描述的Javah文件自動(dòng)生成這個(gè)文件。

2.Java中Native方法的示例

現(xiàn)在我們將看到一個(gè)示例,它將清楚地了解native方法在java中的工作方式。以下是使用native方法所涉及的步驟:

  • 1. 編程java代碼。

  • 2. 編譯java代碼。

  • 3. 創(chuàng)建一個(gè)C頭文件。

  • 4. 在C/C++中實(shí)現(xiàn)native方法邏輯。

  • 5. 創(chuàng)建一個(gè)共享庫(kù)。

  • 6. 運(yùn)行并測(cè)試java應(yīng)用程序。

下面的示例將分為兩部分:具有java代碼和具有native代碼。

第1部分:Java

下面是包含native方法的java類(lèi)。

代碼:

class NativeDemo
{
public native String encryptData (String inputdata);
static
{
System.loadLibrary ("nativedemo");   /* lowercase of classname! */
}
public static void main (String[] args)
{
NativeDemo demo = new NativeDemo ();
System.out.println("Encrypted data is " + demo.encryptData ("This is javakk"));
}
}

上面的示例包含在NativeDemo類(lèi)中聲明的native方法。encryptData方法的實(shí)現(xiàn)是用C編寫(xiě)的。如您所見(jiàn),我們使用了一個(gè)靜態(tài)塊,其目的是加載encryptData方法實(shí)現(xiàn)可用的本機(jī)C庫(kù)。需要注意的一件重要事情是系統(tǒng)中提供的字符串參數(shù)。loadLibrary方法是封閉java類(lèi)的小寫(xiě)名稱(chēng)。現(xiàn)在,按照上面聲明的步驟,是時(shí)候編譯我們的java代碼了。

下面的命令編譯上述java代碼。

javac NativeDemo

現(xiàn)在在下一步中,我們將使用javah實(shí)用程序創(chuàng)建一個(gè)頭文件,如下所述。

javah -jni NativeDemo

上面的命令將生成一個(gè)與類(lèi)名稱(chēng)同名的javah文件。在編寫(xiě)native方法的C實(shí)現(xiàn)時(shí),將包含此文件。

第2部分:C代碼

下面是native函數(shù)encryptData的C實(shí)現(xiàn)。

代碼:

#include <jni.h>
#include <stdio.h>
#include "NativeDemo.h"
JNIEXPORT void JNICALL
Java_NativeDemo_encryptData(JNIEnv *env, jobject obj, jstring inputstr)
{
const char *str= (*env)->GetStringUTFChars(env,inputstr,0) // create string from jstring
char Newch = '@';
for(i = 0; i <= strlen(str); i++)
{
if(str[i] == 'a' || str[i]== 'e' || str[i]== 'i' || str[i]== 'o' || str[i]== 'u' || str[i] == 'A' || str[i]== 'E' || str[i]== 'I' || str[i]== 'O' || str[i]== 'U')
{
str[i] = Newch;
}
}
return env->NewStringUTF(str); // convert string to jstring
}
  • 以上文件與NativeDemo.c一起保存

  • 從上面的代碼中,我們可以看到加密邏輯是用C語(yǔ)言編寫(xiě)的。這個(gè)邏輯只是基于將所有元音替換為@并返回字符串。

  • 編譯上述C代碼

  • 使用命令編譯代碼

  • 上面的命令創(chuàng)建了一個(gè)共享庫(kù),java編程層使用該庫(kù)調(diào)用用C編寫(xiě)的代碼。我們可以根據(jù)編譯器和操作系統(tǒng)使用不同的編譯策略。

完成上述步驟后,我們可以調(diào)用運(yùn)行java代碼,如下所示:

java NativeDemo

如果一切順利,您將看到以下輸出:

Encrypted data is th@s @s @d@bc@

上述就是小編為大家分享的Java中的Native方法是什么了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI