我正在阅读JNI教程,在生成的头文件中遇到了下面的内容。

JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
(JNIEnv *, jobject, jstring);

我可以理解jbyteArray,JNIEnv,jobject和jstring的含义,这些是将信息传递到c程序或从c程序传递信息所必需的。但是我不明白为什么要使用 JNIEXPORT JNICALL 。这些在c程序中的含义是什么(函数,结构,枚举-如果这个问题很琐碎,我感到遗憾)?任何帮助表示赞赏。

最佳答案

JNIEXPORT和JNICALL是使用的宏
指定调用和链接
JNI函数和
本机方法实现。

参见here第12.4节

例如,在我的jvm(Ubuntu 32位)中,头文件jni_md.h包含:

#define JNIEXPORT
#define JNIIMPORT
#define JNICALL

这将使您的函数看起来像:
jbyteArray Java_ReadFile_loadFile
(JNIEnv *,jobject,jstring);

而win32 jni_md.h包含:
#define JNIEXPORT __declspec(dllexport)
#define JNICALL __stdcall

由于Windows使用不同的调用约定,因此您的函数将如下所示:
__declspec(dllexport) jbyteArray __stdcall Java_ReadFile_loadFile
(JNIEnv *, jobject, jstring);

09-27 02:16