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

简介: 【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 __stdcall
typedef 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_) {
}


目录
相关文章
|
2月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
126 11
|
6月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
1155 77
|
3月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
156 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
7月前
|
安全 Android开发 iOS开发
escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
escrcpy 是一款基于 Scrcpy 的开源项目,使用 Electron 构建,提供图形化界面来显示和控制 Android 设备。它支持 USB 和 Wi-Fi 连接,帧率可达 30-120fps,延迟低至 35-70ms,启动迅速且画质清晰。escrcpy 拥有丰富的功能,包括自动化任务、多设备管理、反向网络共享、批量操作等,无需注册账号或广告干扰。适用于游戏直播、办公协作和教育演示等多种场景,是一款轻量级、高性能的 Android 控制工具。
481 1
|
10月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
248 2
|
6月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
555 29
|
6月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
167 4
|
6月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
6月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
6月前
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。