日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android NDK 开发】JNI 方法解析 ( JNIEXPORT 与 JNICALL 宏定义作用 )

發布時間:2025/6/17 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android NDK 开发】JNI 方法解析 ( JNIEXPORT 与 JNICALL 宏定义作用 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

        • I . JNIEXPORT 與 JNICALL 宏定義
        • II . JNIEXPORT 與 JNICALL 宏定義說明 ( Windows 平臺 )
        • III . JNIEXPORT 與 JNICALL 宏定義說明 ( Linux 平臺 )



I . JNIEXPORT 與 JNICALL 宏定義



JNIEXPORT 與 JNICALL 是 JNI 中定義的兩個宏 :


① Windows 平臺宏定義 :

#ifndef _JAVASOFT_JNI_MD_H_ #define _JAVASOFT_JNI_MD_H_#define JNIEXPORT __declspec(dllexport) #define JNIIMPORT __declspec(dllimport) #define JNICALL __stdcalltypedef long jint; typedef __int64 jlong; typedef signed char jbyte;#endif /* !_JAVASOFT_JNI_MD_H_ */

② Linux 平臺宏定義 :

#define JNIIMPORT #define JNIEXPORT __attribute__ ((visibility ("default"))) #define JNICALL

JNIEXPORT 在 Windows 與 Linux 分別對應不同的宏定義 ;


2 . JNIEXPORT 宏定義作用 :


Windows 中如果需要生成動態庫 , 并且需要將該動態庫交給其它項目使用 , 需要在方法前加入特殊標識 , 才能 在外部 程序代碼中 調用該 DLL 動態庫中定義的方法 ;


① Windows 平臺 : 需要將方法 返回值 之前加入 __declspec(dllexport) 標識 ;

② Linux 平臺 : 需要將方法 返回值 之前加入 attribute ((visibility (“default”))) 標識 ;

該聲明的作用是保證在本動態庫中聲明的方法 , 能夠在其他項目中可以被調用 ;


3 . JNICALL宏定義作用 :


① Windows JNICALL : JNICALL 被定義為 __stdcall , __stdcall 是一種函數調用參數的約定 , 在 Windows 中調用函數時 , 該函數的參數是以 棧 的形式保存的 , 棧 中元素是后進先出的 , __stdcall 表示參數是從右到左保存的 ;

__stdcall 用于 定義 函數入棧規則 ( 從右到左 ) , 和 堆棧清理規則 ;


② Linux JNICALL : JNICALL 沒有進行定義 , 直接置空 ; 在 Linux 中可以不用寫 JNIEXPORT 和 JNICALL 宏 ;



II . JNIEXPORT 與 JNICALL 宏定義說明 ( Windows 平臺 )



1 . Windows 平臺宏定義說明 :


① JNIEXPORT 宏定義 : Windows 平臺定義 " #define JNIEXPORT __declspec(dllexport) " , 在編譯器編譯時 , 會使用 "__declspec(dllexport) " 代替 JNIEXPORT ;

② JNICALL 宏定義 : Windows 平臺宏定義 " #define JNICALL __stdcall " , 在編譯時 , 使用 " __stdcall " 代替 JNICALL ;


2 . JNIEXPORT 和 JNICALL 宏替換分析 ( Windows 平臺 ) :


① 使用 JNIEXPORT 和 JNICALL 的原始方法 :

extern "C" JNIEXPORT void JNICALL Java_kim_hsl_jni_Main_jniTest(JNIEnv* env, jobject instance, jint i, jstring s_) { }

② 編譯過程中宏替換后的代碼 :

extern "C" __declspec(dllexport) void __stdcall Java_kim_hsl_jni_Main_jniTest(JNIEnv* env, jobject instance, jint i, jstring s_) { }

III . JNIEXPORT 與 JNICALL 宏定義說明 ( Linux 平臺 )



1 . Linux 平臺宏定義說明 :


① JNIEXPORT 宏定義 : Linux 平臺定義
#define JNIEXPORT attribute ((visibility (“default”))) ,
在編譯器編譯時 , 會使用 "__declspec(dllexport) " 代替 JNIEXPORT ;

② JNICALL 宏定義 : Linux 平臺 該宏定義 為空 ;


2 . JNIEXPORT 和 JNICALL 宏替換分析 ( Linux 平臺 ) :


① 使用 JNIEXPORT 和 JNICALL 的原始方法 :

extern "C" JNIEXPORT void JNICALL Java_kim_hsl_jni_Main_jniTest(JNIEnv* env, jobject instance, jint i, jstring s_) { }

② 編譯過程中宏替換后的代碼 :

extern "C" __attribute__ ((visibility ("default"))) void Java_kim_hsl_jni_Main_jniTest(JNIEnv* env, jobject instance, jint i, jstring s_) { }

總結

以上是生活随笔為你收集整理的【Android NDK 开发】JNI 方法解析 ( JNIEXPORT 与 JNICALL 宏定义作用 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。