91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

如何動態注冊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

禄丰县| 容城县| 徐州市| 云和县| 文成县| 逊克县| 定结县| 东城区| 驻马店市| 海林市| 合作市| 大余县| 晴隆县| 辽宁省| 寻乌县| 绥宁县| 阳江市| 攀枝花市| 乳山市| 汕尾市| 盈江县| 和平区| 巴林左旗| 定安县| 奇台县| 惠水县| 中方县| 禹州市| 永安市| 萨嘎县| 淮北市| 关岭| 长垣县| 两当县| 鄂托克旗| 车险| 毕节市| 泽普县| 安龙县| 汉沽区| 鸡西市|