文章目录

  • 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 宏定义作用 )相关推荐

  1. 【Android NDK 开发】JNI 方法解析 ( JNIEnv *env 参数 )

    文章目录 一. JNI 方法解析 二. JNIEnv *env 参数解析 三. C 语言 环境中 JNIEnv *env 参数解析 四. C ++ 环境中 JNIEnv *env 参数解析 总结 : ...

  2. Android NDK开发之旅(3): 详解JNI数据类型与C/C++、Java之间的互调

    Android NDK开发之旅(3):详解JNI数据类型与C/C++.Java之间的互调 (码字不易,转载请声明出处:http://blog.csdn.net/andrexpert/article/d ...

  3. Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发

    Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...

  4. 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】

    Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...

  5. Android 高级开发 JNI NDK 介绍与使用

    Android 高级开发 JNI & NDK 介绍与使用 前言 对于没接触过的领域,即是挑战也是机遇,不仅能够提升自己的能力.还能够学习到新的技术知识 而学习新的技术的时候,最好是从头开始按照 ...

  6. OpenCV android sdk配置OpenCV android NDK开发实例

    OpenCV android sdk配置OpenCV android NDK开发实例 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/det ...

  7. 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

    文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...

  8. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  9. 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )

    文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

最新文章

  1. 自己动手用gensim 生成句子的word2vec 向量
  2. syslog 向内存中缓存_漫谈缓存(Cache)、大规模芯片系统的存储层次结构优化以及开源仿真工具ZSim...
  3. 视频播放页php,html jquery简易视频播放器
  4. ITK:查看矢量图像的分量
  5. linux 根据ip查机器名
  6. java访问类的方法_Java:如何从另一个类访问方法
  7. 基于OpencCV的彩色图像的分离与合并
  8. ireport怎么套打_方向盘套你选对了吗?老司机告诉你该这样做|酷斯特玩车
  9. Mysql Explain用法pdf
  10. 突然发现到今天已经很难找到对底层理解这么透彻的人
  11. (对比PDF)Adobe Acrobat DC 离线对比PDF、draftable.com/compare 在线对比PDF
  12. 语句 查询每个人每个科目的最高分_Mysql中常用的查询实例详解
  13. win10下乌龟git安装和使用
  14. 动态规划——状态转移方程
  15. 台达伺服调试软件_万能机智能伺服油源调试说明
  16. ios免越狱脚本实现方案
  17. 蓝桥杯模拟赛 青出于蓝而胜于蓝
  18. 浅谈探索性数据分析的方法—如何下手处理一堆繁杂的数据
  19. .net mysql sqlhelper_「谢灿asp.net三层架构」5、DAL中公共类-SqlHelper类应该这样写
  20. 《时光不再,你还在》凌莫寒白静熙第二章 这么开心的时刻,他只想和我庆祝...

热门文章

  1. SharePoint Conference 2008 - Day 1
  2. 一种结合混沌密码理论的彩色图象水印算法
  3. P1642 规划 01分数规划+树形DP
  4. 【转载】 C# 中的Async 和 Await 的用法详解
  5. Ajax+Node.js前后端交互最佳入门实践(05)
  6. 洛谷 P1985 翻转棋
  7. 在Python中用Selenium执行JavaScript
  8. redirect_uri参数错误解决方法
  9. xcode编译Undefined symbols for architecture i386问题解决
  10. 外媒列举2011年十大IT预测:鲍尔默卸任微软CEO