中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何動態注冊native函數

發布時間:2021-10-14 14:47:23 來源:億速云 閱讀:93 作者:柒染 欄目:編程語言

本篇文章為大家展示了如何動態注冊native函數,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

Java JNI是一種靜態注冊native函數的方式。它的缺點是對每一個聲明有native函數的java都需要生成.h,然后再做成鏈接庫。相對繁瑣。

其實java native函數和JNI函數的一一對應關系可以理解為函數和函數指針的關系,因此可以存在一種動態注冊的方式注冊函數。

Andoird 中使用了一種JNINativeMethod結構體還存放這種關聯關系,即Andorid使用了一種Java 和 C 函數的映射表數組,并在其中描述了函數的參數和返回值。這個數組的類型是JNINativeMethod,定義如下:

typedef struct {
const char* name;         // native函數名稱
const char* signature;  // native函數簽名,主要包括函數參數類型和返回值
void*fnPtr;                       //函數指針,用于創建關聯關系
} JNINativeMethod;

第一個變量name是Java中函數的名字。

第二個變量signature,用字符串是描述了函數的參數和返回值

第三個變量fnPtr是函數指針,指向C函數。

其中比較難以理解的是第二個參數,例如

"()V"

"(II)V"

"(Ljava/lang/String;Ljava/lang/String;)V"

實際上這些字符是與函數的參數類型一一對應的。

"()" 中的字符表示參數,后面的則代表返回值。例如"()V" 就表示void Func();

"(II)V" 表示 void Func(int, int);

具體的每一個字符的對應關系如下

字符Java類型C類型

V     void           void
Z      jboolean    boolean
I       jint              int
J       jlong           long
D     jdouble      double
F     jfloat           float
B     jbyte           byte
C     jchar          char
S     jshort         short

數組則以"["開始,用兩個字符表示

[I      jintArray     int[]
[F    jfloatArray   float[]
[B    jbyteArray   byte[]
[C   jcharArray   char[]
[S   jshortArray  short[]
[D   jdoubleArraydouble[]
[J    jlongArray    long[]
[Z   jbooleanArrayboolean[]

上面的都是基本類型。如果Java函數的參數是class,則以"L"開頭,以";"結尾中間是用"/" 隔開的包及類名。而其對應的C函數名的參數則為jobject. 一個例外是String類,其對應的類為jstring

Ljava/lang/String;Stringjstring
Ljava/net/Socket;Socketjobject

如果JAVA函數位于一個嵌入類,則用$作為類名間的分隔符。

例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z"

上述內容就是如何動態注冊native函數,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

建湖县| 女性| 鄂温| 长沙县| 安塞县| 河间市| 牙克石市| 松桃| 犍为县| 武平县| 昭觉县| 大连市| 伊金霍洛旗| 江北区| 五常市| 桃江县| 子长县| 遵化市| 洛宁县| 潮安县| 双流县| 寻乌县| 绵竹市| 乃东县| 榆林市| 古丈县| 莱西市| 东乌珠穆沁旗| 漳浦县| 杭锦旗| 西藏| 拉萨市| 齐河县| 四平市| 阿克陶县| 雷州市| 如东县| 格尔木市| 洛隆县| 浮山县| 简阳市|