Попытка понять вызов функции C в JNI.h - PullRequest
2 голосов
/ 24 февраля 2012

Я погружаюсь в исходный код Java OpenJDK, и я надеялся узнать немного о CallStaticVoidMethod.Но мне тяжело это делать.

Вот где меня топнули:

00535     void (JNICALL *CallStaticVoidMethod)
00536       (JNIEnv *env, jclass cls, jmethodID methodID, ...);

Если мои грубые знания C верны, это похоже на вызов функции (куда?).Может быть, это происходит из-за того, что вы вызываете какую-то уже скомпилированную библиотеку?

(JNICALL - просто соглашение о вызовах), поскольку JNICALL выглядит как __stdcall ( Что такое __stdcall? )

Вот полный исходный код файла: http://xdprof.sourceforge.net/doxygen/jni_8h-source.html

Спасибо

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Maybe it could be that's making a call to some alread compiled library?

Да, я думаю, вам нужно немного узнать о том, что такое JNI. Позвольте мне постараться представить этот фон быстро, так как я думаю, что он прояснит ваше замешательство или, по крайней мере, поставит вас на правильный путь.

Среды исполнения Java не могут работать на Java - они реализованы как собственные исполняемые файлы.

JNI (собственный интерфейс Java), по сути, является нативным интерфейсом для запроса среды выполнения Java о различных действиях.

Среди множества других вещей, , вы можете использовать JNI для вызова методов, реализованных в Java .

JNI имеет несколько различных вспомогательных методов для вызова различных типов методов.

Метод, о котором вы спрашиваете, в частности, CallStaticVoidMethod будет использоваться для вызова функции Java, такой как в этом примере: public static void DoSomething() { ... }

Чтобы среда выполнения вызывала этот метод, ему необходимо знать несколько вещей, таких как: информация о текущей среде выполнения / контексте / среде (это параметр JNIEnv * env), класс, который объявлен статическим методом. in (это параметр jclass cls), метод для вызова (это параметр jmethodID methodID).

EDIT:

Продолжение вашего ответа:

Я нашел это без особых проблем в коде OpenJDK.

http://hg.openjdk.java.net/

cvmi / cvmi / jdk Common VM Interface

http://hg.openjdk.java.net/cvmi/cvmi/jdk/archive/tip.zip

Под:

. / ЦСИ / доля / JavaVM / экспорт / jni.h

void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) {
    va_list args;
    va_start(args,methodID);
    functions->CallStaticVoidMethodV(this,cls,methodID,args);
    va_end(args);
}

Я не знаю, где это назначено: functions->CallStaticVoidMethodV, но я уверен, что если у вас возникнут проблемы с загрузкой всего исходного кода для различных компонентов, вы найдете структуру с этим членом и / или назначением на указатель этой функции - и вы можете перейти оттуда.

Поскольку он должен быть стандартным / общим интерфейсом для нескольких сред выполнения, я не удивлюсь, если будет существовать некоторый уровень косвенности между фактической реализацией и тем, как она отображается через JNI.

1 голос
/ 24 февраля 2012

Это объявляет CallStaticVoidMethod как указатель на функцию, которая ничего не возвращает и принимает три или более аргументов.

...