Попытка понять вызов функции C в JNI.h

Я погружаюсь в исходный код 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

Спасибо


person devoured elysium    schedule 24.02.2012    source источник


Ответы (2)


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), класс, в котором объявлен статический метод (это jclass cls), вызываемый метод (это параметр jmethodID methodID).

РЕДАКТИРОВАТЬ:

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

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

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

cvmi / cvmi / jdk Общий интерфейс виртуальных машин

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

Под:

./src/share/javavm/export/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.

person Steve    schedule 24.02.2012
comment
Стив, мне уже были хорошо известны упомянутые вами факты о JNI. Фактически, это именно тот мотив, по которому я пытаюсь заполучить тело этой функции. У меня вопрос ... где его источник? - person devoured elysium; 24.02.2012
comment
@Devouredelysium - Ах, хорошо, извините. Что ж, предоставленная вами ссылка не является ссылкой на java runtime / vm, поэтому реализация не будет в этом проекте. Если вы спрашиваете, где находится реализация в материале OpenJDK - я знаю идею, но мой хороший друг grep, вероятно, знает. - person Steve; 24.02.2012
comment
Ой, извини. Я уже видел функцию, которую вы сейчас показываете. Но у меня была идея, что это последняя функция вызывала другую, показанную в OP. Если я ошибаюсь, то я хотел бы знать, где находятся функции - ›CallStaticVoidMethodV (this, cls, methodID, args). - person devoured elysium; 24.02.2012
comment
@devouredelysium - functions - это переменная некоторого типа, которая имеет указатель на функцию CallStaticVoidMethodV, которая где-то назначена. Вам нужно будет найти, где он назначен. Я добавил больше к редактированию, чтобы объяснить, почему я держу пари, что это, вероятно, на один уровень удалено от фактической реализации, которую вы ищете. - person Steve; 24.02.2012
comment
функции назначаются прямо в этом файле, если не ошибаюсь. В той же структуре вы найдете функцию, показанную в OP. - person devoured elysium; 24.02.2012
comment
line782: const struct JNINativeInterface_ * functions; - person devoured elysium; 24.02.2012
comment
позвольте нам продолжить это обсуждение в чате - person devoured elysium; 24.02.2012
comment
Стив, я награждаю вас ответом, поскольку после просмотра предоставленной вами ссылки hg.openjdk.java .net, в конце концов я нашел более полезный код, который оказался очень полезным для выполнения моей задачи. - person devoured elysium; 25.02.2012

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

person Nikolai Fetissov    schedule 24.02.2012