我正在阅读JNI教程,我在生成的头文件中遇到了以下行。
JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
(JNIEnv *, jobject, jstring);
我可以理解 jbyteArray , JNIEnv , jobject 和 jstring 的含义。这些都需要通过来自c程序的信息。但是我无法理解为什么使用 JNIEXPORT 和 JNICALL 。这些在c程序中被称为什么(函数,结构,枚举 - 如果这个问题非常简单,我很遗憾)?任何帮助表示赞赏。
答案 0 :(得分:4)
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);