我正在阅读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);