Нужна помощь в понимании сгенерированного файла заголовка JNI

Я просматривал учебник JNI и наткнулся на строку ниже в сгенерированном файле заголовка.

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

Я могу понять значение jbyteArray, JNIEnv, jobject и jstring. Они необходимы для передачи информации и из программы c. Но я не смог понять, почему используются JNIEXPORT и JNICALL. И как они называются в программе c (функция, структура, перечисление - я сожалею, если этот вопрос очень тривиален)? Любая помощь приветствуется.


person hnm    schedule 28.03.2011    source источник


Ответы (1)


JNIEXPORT и JNICALL - это макросы, используемые для указания соглашения о вызове и связывании как функций JNI, так и реализаций собственных методов.

См. здесь, раздел 12.4.

Например, в моем jvm (32-разрядная версия Ubuntu) файл заголовка 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);
person MByD    schedule 28.03.2011