JNI 中的宏定義

一文兢、宏定義

宏定義可以理解為就是定義一個(gè)常量或一個(gè)函數(shù)晤斩,實(shí)現(xiàn)復(fù)用,易于統(tǒng)一維護(hù)和修改姆坚。

// 不帶參數(shù)的宏定義
#define MAX 10

// 帶參宏定義
#define M(y) y * y + 3 * y

// 宏調(diào)用
k = M(5);

二澳泵、JNIEXPORTJNICALL

JNIEXPORTJNICALL 實(shí)際上是 JNI 中定義的兩個(gè)宏,它們?cè)?WindowsLinux 分別有不同的定義兼呵。

// Windows 系統(tǒng)
#ifndef _JAVASOFT_JNI_MD_H_
#define _JAVASOFT_JNI_MD_H_

#define JNIEXPORT __declspec(dllexport)
#define JNIIMPORT __declspec(dllimport)
#define JNICALL __stdcall

typedef long jint;
typedef __int64 jlong;
typedef signed char jbyte;

#endif /* !_JAVASOFT_JNI_MD_H_ */
// Linux 系統(tǒng)
#define JNIIMPORT
#define JNIEXPORT  __attribute__ ((visibility ("default")))
#define JNICALL
三兔辅、JNIEXPORTJNICALL 宏定義作用
  • JNIEXPORT 宏定義作用
    如果我們的程序需要生成動(dòng)態(tài)鏈接庫(kù) , 并且要把該動(dòng)態(tài)鏈接庫(kù)交給其它程序使用, 那么就需要在函數(shù)前加入特殊標(biāo)識(shí) , 才能在其它程序代碼中調(diào)用該動(dòng)態(tài)鏈接庫(kù)中定義的函數(shù) 。動(dòng)態(tài)鏈接庫(kù)在 Windows 系統(tǒng)和 Linux 系統(tǒng)中通常分別是 .dll文件 和 .so文件击喂。
    那么根據(jù)不同系統(tǒng)中 JNIEXPORT 宏定義的不同维苔,在預(yù)編譯時(shí)就會(huì)進(jìn)行對(duì)應(yīng)的宏替換。
  • JNICALL 宏定義作用
    • Windows 系統(tǒng)中 JNICALL 宏定義為 __stdcall , __stdcall 是一種函數(shù)調(diào)用約定 , 因?yàn)楫?dāng)程序編譯為本地機(jī)器碼由 CPU 執(zhí)行時(shí)懂昂,CPU無(wú)法明確知道每個(gè)函數(shù)應(yīng)該怎么傳參介时,于是提供了棧結(jié)構(gòu)來(lái)支持參數(shù)傳遞,但當(dāng)調(diào)用函數(shù)有多個(gè)參數(shù)時(shí)凌彬,參數(shù)應(yīng)該按照怎樣的順序入棧沸柔,然后函數(shù)調(diào)用完棧又應(yīng)該由誰(shuí)來(lái)清理,針對(duì)這兩個(gè)問(wèn)題铲敛,出現(xiàn)了一些函數(shù)調(diào)用約定褐澎,__stdcall 就是其中的一種,__stdcall 修飾的函數(shù)在調(diào)用時(shí)參數(shù)都是從右向左依次被壓入到棧中伐蒋,函數(shù)調(diào)用完在返回前由被調(diào)用函數(shù)自己負(fù)責(zé)清理堆棧工三。

    • Linux 系統(tǒng)中 JNICALL 沒(méi)有進(jìn)行定義 , 直接置空, 因此在 Linux 中是可以不用寫 JNICALL 宏的 迁酸。

四、JNIEXPORTJNICALL 宏替換

  • Windows 系統(tǒng) :
// 使用 JNIEXPORT 和 JNICALL 的原始方法
extern "C"
JNIEXPORT void JNICALL Java_bytecode_NativeTest_sayWithMsgAndNum(JNIEnv *jniEnv, jobject obj, jstring msg, jint num) {
    // 函數(shù)體
}
// 預(yù)編譯過(guò)程中宏替換后的方法
extern "C"
__declspec(dllexport) void __stdcall Java_bytecode_NativeTest_sayWithMsgAndNum(JNIEnv *jniEnv, jobject obj, jstring msg, jint num) {
    // 函數(shù)體
}
  • Linux 系統(tǒng)
// 使用 JNIEXPORT 和 JNICALL 的原始方法
extern "C"
JNIEXPORT void JNICALL Java_bytecode_NativeTest_sayWithMsgAndNum(JNIEnv *jniEnv, jobject obj, jstring msg, jint num) {
    // 函數(shù)體
}
// 預(yù)編譯過(guò)程中宏替換后的方法
extern "C"
__attribute__ ((visibility ("default"))) void Java_bytecode_NativeTest_sayWithMsgAndNum(JNIEnv *jniEnv, jobject obj, jstring msg, jint num) {
    // 函數(shù)體
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俭正,一起剝皮案震驚了整個(gè)濱河市胁出,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌段审,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闹蒜,死亡現(xiàn)場(chǎng)離奇詭異寺枉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)绷落,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門姥闪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人砌烁,你說(shuō)我怎么就攤上這事筐喳。” “怎么了函喉?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵避归,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我管呵,道長(zhǎng)梳毙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任捐下,我火速辦了婚禮账锹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坷襟。我一直安慰自己奸柬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布婴程。 她就那樣靜靜地躺著廓奕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪档叔。 梳的紋絲不亂的頭發(fā)上懂从,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蹲蒲,去河邊找鬼番甩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛届搁,可吹牛的內(nèi)容都是我干的缘薛。 我是一名探鬼主播窍育,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宴胧!你這毒婦竟也來(lái)了漱抓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恕齐,失蹤者是張志新(化名)和其女友劉穎乞娄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體显歧,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仪或,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了士骤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片范删。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拷肌,靈堂內(nèi)的尸體忽然破棺而出到旦,到底是詐尸還是另有隱情,我是刑警寧澤巨缘,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布添忘,位于F島的核電站,受9級(jí)特大地震影響若锁,放射性物質(zhì)發(fā)生泄漏昔汉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一拴清、第九天 我趴在偏房一處隱蔽的房頂上張望靶病。 院中可真熱鬧,春花似錦口予、人聲如沸娄周。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)煤辨。三九已至,卻和暖如春木张,著一層夾襖步出監(jiān)牢的瞬間众辨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工舷礼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹃彻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓妻献,卻偏偏與公主長(zhǎng)得像蛛株,于是被迫代替她去往敵國(guó)和親团赁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • JNI編程 JNI是一種本地編程接口谨履。它允許運(yùn)行在JAVA虛擬機(jī)中的JAVA代碼和用其他編程語(yǔ)言欢摄,諸如C語(yǔ)言、C+...
    微塵_8957閱讀 455評(píng)論 0 0
  • 1.C語(yǔ)言預(yù)處理理論 1.1、由源碼到可執(zhí)行程序的過(guò)程 (1)源碼.c→(預(yù)處理)→預(yù)處理過(guò)的.i源文件→(編譯)...
    嵌入式Linux小白閱讀 702評(píng)論 0 0
  • JNI-Java Native Interface害捕,是Java平臺(tái)提供的一個(gè)特性绿淋,通過(guò)編寫JNI函數(shù)實(shí)現(xiàn)Java代...
    李牙刷兒閱讀 592評(píng)論 0 2
  • 談?wù)動(dòng)H子閱讀和交流的好處。 讀原著吨艇,是需要勇氣的,也需要一定能力腾啥。 午休东涡,叫了一個(gè)班上學(xué)習(xí)相對(duì)比...
    分明魚閱讀 579評(píng)論 2 5
  • 南疆掛職,顧名思義倘待,從新疆非南疆地區(qū)組織干部赴南疆三地州進(jìn)行掛職疮跑,簡(jiǎn)單的講就是解決南疆干部力量不足的問(wèn)題,干部也抱...
    逆襲爽風(fēng)閱讀 1,157評(píng)論 0 0