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

JNI語言基本知識

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

JNI簡介

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

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

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

JNIEXPORT void JNICALL Java_com_tao_test_NativeTest_sayHello (JNIEnv * , jclass);

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

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

JNIEXPORT void JNICALL Java_com_tao_test_NativeTest_sayHello (JNIEnv * , jobject);

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

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

NewObject   創(chuàng)建一個對象

NewString  創(chuàng)建一個String對象

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

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

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

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

等等許多函數(shù)

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

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

Java類型和C/C++數(shù)據(jù)類型的對應(yīng)關(guān)系,可以看到,這些新定義的類型名稱和Java類型名稱具有一致性,只是在前面加了個j,如int對應(yīng)jint,long對應(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,對應(yīng)的是C/C++中的long類型。

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

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

實際上,所以帶j的類型,都是代表Java中的類型,它與C/C++中的類型是不一樣的,所以在內(nèi)部都要轉(zhuǎn)換,我們在使用的時候也需要小心。可以看后面關(guān)于JNI中對字符串的操作。

三。Java對象在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 {}; 

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

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

四、jclass類和如何取得jclass對象

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

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

FindClass會在系統(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對象,即jclass,那么就可以用和反射差不多的形式,來得到j(luò)ava類中的成員變量和方法等等,雖然方式和Class不一樣,不過大抵的形式相當(dāng)。

總結(jié)

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

相關(guān)文章

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

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

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

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

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

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

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

    Java中Calendar時間操作常用方法詳解

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

    扒一扒 Java 中的枚舉類型

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

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

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

    JUC之CountdownLatch使用詳解

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

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

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

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

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

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

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

最新評論