【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_) {
}


目录
相关文章
|
6天前
|
机器学习/深度学习 Java Shell
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
26 0
|
1天前
|
Java 开发工具 Android开发
鸿蒙HarmonyOS 与 Android 的NDK有什么区别?
鸿蒙(HarmonyOS)和Android的NDK(Native Development Kit)是两个不同的概念,它们在设计理念、架构、开发方式和目标平台等方面存在着一些显著的不同。
4 0
|
3天前
|
Java Android开发
Android开发--Intent-filter属性详解
Android开发--Intent-filter属性详解
|
3天前
|
物联网 Java 开发工具
安卓应用开发:打造未来移动生活
【5月更文挑战第10天】 随着科技的飞速发展,智能手机已成为我们日常生活中不可或缺的一部分。作为智能手机市场的两大巨头,安卓和iOS分别占据了一定的市场份额。在这篇文章中,我们将重点关注安卓应用开发,探讨如何利用先进的技术和创新思维,为用户打造更加便捷、智能的移动生活。文章将涵盖安卓应用开发的基本概念、关键技术、以及未来发展趋势等方面的内容。
|
5天前
|
Java API 开发工具
java与Android开发入门指南
java与Android开发入门指南
12 0
|
6天前
|
程序员 Android开发
Android亮度调节的几种实现方法
Android亮度调节的几种实现方法
9 0
|
6天前
|
Shell Android开发
Android Activity重写dump方法实现通过adb调试代码
Android Activity重写dump方法实现通过adb调试代码
12 0
|
6天前
|
Android开发
Android APP 隐藏系统软键盘的方法
Android APP 隐藏系统软键盘的方法
11 0
|
2天前
PandasTA 源码解析(二十三)
PandasTA 源码解析(二十三)
7 0
|
2天前
PandasTA 源码解析(二十二)(3)
PandasTA 源码解析(二十二)
5 0