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

JNI語言基本知識(shí)

 更新時(shí)間:2017年10月18日 10:22:00   作者:動(dòng)力節(jié)點(diǎn)  
JNI是Java Native Interface的縮寫,它提供了若干的API實(shí)現(xiàn)了Java和其他語言的通信(主要是C&C++)。接下來通過本文給大家分享jni 基礎(chǔ)知識(shí),感興趣的朋友一起看看吧

JNI簡(jiǎn)介

JNI是Java Native Interface的縮寫,它提供了若干的API實(shí)現(xiàn)了Java和其他語言的通信(主要是C&C++)。從Java1.1開始,JNI標(biāo)準(zhǔn)成為java平臺(tái)的一部分,它允許Java代碼和其他語言寫的代碼進(jìn)行交互。JNI一開始是為了本地已編譯語言,尤其是C和C++而設(shè)計(jì)的,但是它并不妨礙你使用其他編程語言,只要調(diào)用約定受支持就可以了。使用java與本地已編譯的代碼交互,通常會(huì)喪失平臺(tái)可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的。例如,使用一些舊的庫,與硬件、操作系統(tǒng)進(jìn)行交互,或者為了提高程序的性能。JNI標(biāo)準(zhǔn)至少要保證本地代碼能工作在任何Java 虛擬機(jī)環(huán)境。

一、本地方法的參數(shù)

如何本地方法聲明為static,那么生成的頭文件中的本地方法形式如下:

JNIEXPORT void JNICALL Java_com_tao_test_NativeTest_sayHello (JNIEnv * , jclass);

這兩個(gè)參數(shù)的意思是什么:JNIEnv類型實(shí)際上代表了Java環(huán)境。通過這個(gè)JNIEnv*指針,就可以對(duì)Java端的代碼進(jìn)行操作。例如,創(chuàng)建Java類的對(duì)象,調(diào)用Java對(duì)象的方法,獲取Java對(duì)象的屬性等等。JNIEnv的指針會(huì)被JNI傳入到本地方法的實(shí)現(xiàn)函數(shù)中來對(duì)Java端的代碼進(jìn)行操作。而jclass,則代表調(diào)用這個(gè)靜態(tài)方法類的Class對(duì)象,即該Class類的字節(jié)碼。

如何本地方法沒有聲明為static,那么生成的頭文件中的本地方法形式如下:

JNIEXPORT void JNICALL Java_com_tao_test_NativeTest_sayHello (JNIEnv * , jobject);

jobject類型相當(dāng)于java中的Object類型,它代表調(diào)用這個(gè)本地方法的對(duì)象,實(shí)際上準(zhǔn)確的說,,保持了一個(gè)對(duì)  調(diào)用這個(gè)方法的的對(duì)象的引用。比如說,如果是new NativeTest().sayHello()調(diào)用這個(gè)方法,那么這個(gè)引用指向了這個(gè)new NativeTest()對(duì)象。

JNIEnv類中有許多函數(shù)可以用:

NewObject   創(chuàng)建一個(gè)對(duì)象

NewString  創(chuàng)建一個(gè)String對(duì)象

New<TYPE>Array  創(chuàng)建某個(gè)類型的數(shù)組

Get/Set<TYPE>Field   獲取或設(shè)置某個(gè)成員變量的屬性 

Get/SetStatic<TYPE>Field  獲取或設(shè)置某個(gè)成靜態(tài)員變量的屬性

Call<TYPE>Method/CallStatic<TYPE>Method   調(diào)用某個(gè)java對(duì)象的方法/或靜態(tài)方法

等等許多函數(shù)

二、數(shù)值參數(shù)

用Java代碼調(diào)用C\C++代碼時(shí)候,肯定會(huì)有數(shù)值的傳遞。兩者屬于不同的編程語言,在數(shù)據(jù)類型上有很多差別,應(yīng)該要知道他們彼此之間的對(duì)應(yīng)類型。例如,盡管C擁有int和long的數(shù)據(jù)類型,但是他們的實(shí)現(xiàn)卻是取決于平臺(tái)的。在一些平臺(tái)上,int類型是16位的,而在另外一些平臺(tái)上市32位的整數(shù)?;谶@個(gè)原因,Java本地接口定義了jint,jlong等等。

Java類型和C/C++數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系,可以看到,這些新定義的類型名稱和Java類型名稱具有一致性,只是在前面加了個(gè)j,如int對(duì)應(yīng)jint,long對(duì)應(yīng)jlong。

我們看看jni.h和jni_md.h頭文件,可以更直觀的了解:

typedef unsigned char  jboolean; 
typedef unsigned short jchar; 
typedef short      jshort; 
typedef float      jfloat; 
typedef double     jdouble; 
typedef long jint; 
typedef __int64 jlong; 
typedef signed char jbyte; 

可以看到,例如jint代表的是和Java類型int一樣的類型,但是并不是C/C++中int。從定義可以看到,Java中的int,也就是jni中的jint,對(duì)應(yīng)的是C/C++中的long類型。

所以如果要在本地方法中要定義一個(gè)jint類型的數(shù)據(jù),規(guī)范的寫法應(yīng)該是 jint i=10L;

在 比如jchar代表的是Java類型的char類型,實(shí)際上在C/C++中卻是unsigned short類型 ,而在C/C++中有這樣的定義:typedef unsigned short wchar_t。所以jchar就是相當(dāng)于C/C++中的寬字符,也就是說java中的char  相當(dāng)于C/C++中的寬字符。所以如果要在本地方法中要定義一個(gè)jchar類型的數(shù)據(jù),規(guī)范的寫法應(yīng)該是jchar c=L'C';

實(shí)際上,所以帶j的類型,都是代表Java中的類型,它與C/C++中的類型是不一樣的,所以在內(nèi)部都要轉(zhuǎn)換,我們?cè)谑褂玫臅r(shí)候也需要小心??梢钥春竺骊P(guān)于JNI中對(duì)字符串的操作。

三。Java對(duì)象在C\C++代碼中的形式

查看jni.h頭文件,可以看到下面的內(nèi)容

class _jclass : public _jobject {}; 
class _jthrowable : public _jobject {}; 
class _jstring : public _jobject {}; 
class _jarray : public _jobject {}; 
class _jbooleanArray : public _jarray {}; 
class _jbyteArray : public _jarray {}; 
class _jcharArray : public _jarray {}; 
class _jshortArray : public _jarray {}; 
class _jintArray : public _jarray {}; 
class _jlongArray : public _jarray {}; 
class _jfloatArray : public _jarray {}; 
class _jdoubleArray : public _jarray {}; 
class _jobjectArray : public _jarray {}; 

其實(shí)這些加了_j首字母的類,都是集成于_jobject,這也是為了照顧我們java中的,Object類是一切類的基類。

這些類,對(duì)應(yīng)的就是java中的類,只不過,在C/C++中換了中形式而已。

四、jclass類和如何取得jclass對(duì)象

在Java中,Class類型代表一個(gè)類編譯的字節(jié)碼,即這個(gè)類,里面包含了這個(gè)類的所有信息。在JNI中,同樣定義了這樣一個(gè)類,那就是jclass。了解反射的人都知道Class類是如何重要,可以通過反射獲得java類的信息和訪問里面的方法和成員變量。所以在JNI中,也有這樣一個(gè)jclass類,來代表Class類。
JNIEnv有幾個(gè)方法可以取得jclass對(duì)象:

jclass FindClass(const char *name) {
    return functions->FindClass(this, name);
 }

FindClass會(huì)在系統(tǒng)classpath下尋找類,傳入完整的類型,注意包的間隔使用   / ,而不是.   比如:

jclass cls_string=env->FindClass("java/lang/String");
jclass GetObjectClass(jobject obj) {
    return functions->GetObjectClass(this,obj);
  }
jclass GetSuperclass(jclass sub) {
    return functions->GetSuperclass(this, sub);
  }

得到j(luò)ava類的Class對(duì)象,即jclass,那么就可以用和反射差不多的形式,來得到j(luò)ava類中的成員變量和方法等等,雖然方式和Class不一樣,不過大抵的形式相當(dāng)。

總結(jié)

以上所述是小編給大家介紹的JNI語言基本知識(shí),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫信息脫敏的方法詳解

    SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫信息脫敏的方法詳解

    這篇文章主要介紹了SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫信息的脫敏,以此來保護(hù)數(shù)據(jù)庫的用戶名username和密碼password(容易上手,詳細(xì)),文中有詳細(xì)的圖文講解和代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06
  • 使用springboot配置和占位符獲取配置文件中的值

    使用springboot配置和占位符獲取配置文件中的值

    這篇文章主要介紹了使用springboot配置和占位符獲取配置文件中的值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 解析spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class

    解析spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class

    這篇文章主要介紹了spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Java中Calendar時(shí)間操作常用方法詳解

    Java中Calendar時(shí)間操作常用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java中Calendar時(shí)間操作常用方法,calendar中set方法和靜態(tài)屬性帶來的一些坑,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 扒一扒 Java 中的枚舉類型

    扒一扒 Java 中的枚舉類型

    這篇文章主要給大家介紹了Java中枚舉類型的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 簡(jiǎn)單介紹一下什么是microservice微服務(wù)

    簡(jiǎn)單介紹一下什么是microservice微服務(wù)

    這篇文章主要介紹了一下什么是microservice微服務(wù)微服務(wù)的定義,微服務(wù)到底是什么意思?什么樣的架構(gòu)可以叫做微服務(wù)?這篇文章可以給你答案
    2023-03-03
  • JUC之CountdownLatch使用詳解

    JUC之CountdownLatch使用詳解

    這篇文章主要介紹了JUC之CountdownLatch使用詳解,CountdownLatch 用來進(jìn)行線程同步協(xié)作,等待所有線程完成倒計(jì)時(shí),
    其中構(gòu)造參數(shù)用來初始化等待計(jì)數(shù)值,await() 用來等待計(jì)數(shù)歸零,countDown() 用來讓計(jì)數(shù)減一,需要的朋友可以參考下
    2023-12-12
  • 使用lombok@Data存在extends時(shí)需要注意的問題

    使用lombok@Data存在extends時(shí)需要注意的問題

    在Java編程中,正確實(shí)現(xiàn)equals方法是保證對(duì)象比較一致性的關(guān)鍵,使用instanceof檢查類型可能導(dǎo)致違反對(duì)稱性原則,即當(dāng)子類和父類都重寫equals時(shí)可能出現(xiàn)a.equals(b)不等于b.equals(a)的情況,Lombok的@EqualsAndHashCode注解可以通過callSuper=true參數(shù)
    2024-10-10
  • maven創(chuàng)建spark項(xiàng)目的pom.xml文件配置demo

    maven創(chuàng)建spark項(xiàng)目的pom.xml文件配置demo

    這篇文章主要為大家介紹了maven創(chuàng)建spark項(xiàng)目的pom.xml文件配置demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 一問詳解SpringBoot配置文件優(yōu)先級(jí)

    一問詳解SpringBoot配置文件優(yōu)先級(jí)

    在SpringBoot項(xiàng)目當(dāng)中,我們要想配置一個(gè)屬性,可以通過這三種方式當(dāng)中的任意一種來配置都可以,那么優(yōu)先級(jí)怎么算,本文主要介紹了一問詳解SpringBoot配置文件優(yōu)先級(jí),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論