Виклик методів Java

з програм на C нагадує виклик конструкторів Java Для цього використовуються такі основні функції:

long *execute_java_static_method(ExecEnv *ee, ClassClass *cb, char *method_name, char *signature, ..)

Виконує статичний метод класу, описуваного параметром cb

long *execute_java_dynamic_method(ExecEnv *ee, HObject *obj, char *method_name, char *signature, ..)

Виконує нестатичних (динамічний) метод для заданого обєкта

В обох функціях, параметр method_name є імям викликається методу, а signature описує передаються аргументи На відміну від конструкторів, ви також повинні оголосити повертається методом тип після закриває дужки в сигнатурі Повертається тип вказується з використанням тих же скорочень, що й для типу параметрів, з додатковою буквою V для void Приклади наведені нижче Ви повинні самі привести тип long до поверненню типом методу або проігнорувати його для методів типу void

Для отримання структури класу, використовуваної при виклику статичних методів,

застосовується одна з двох функцій FindClass:

ClassClass *FindClass(ExecEnv *ee, char *class_name, bool_t resolve)

Повертає покажчик на структуру ClassClass для заданого класу Як і колись, параметр типу ExecEnv слід отримати від функції EE Логічна величина resolve аналогічна однойменним параметру, використовуваному методом ClassLoaderloadClass в розділі 132

ClassClass *FindClassFromClass(ExecEnv *ee, char *class_name, bool_t resolve, ClassClass

*from)

Повертає покажчик на обєкт-клас для заданого класу з використанням обєкта ClassLoader класу from

Наведемо приклад, в якому метод Systemoutprintln()  викликається для виведення відомостей про роботу рідного методу Статичний рідний метод grindAway класу Crunch, Наведений нижче, здійснює деякі трудомісткі обчислення і повертає результат типу double:

double

Crunch_grindAway(struct HCrunch *this_h)

{

ClassClass *myClass HObject *out

long i

double result

ExecEnv * ee = EE () / * Використовується в декількох місцях * /

myClass = FindClass(ee, &quotCrunch&quot, TRUE)

out = (HObject *)execute_java_static_method(ee, myClass, &quotoutStream&quot, &quot()Ljava/io/PrintStream&quot)

if (exceptionOccurred(ee))

return 00

for (i = 0 i &lt&lt NUM_PASSES i++) {

execute_java_dynamic_method(ee, out, &quotprintln&quot, &quot(I)V&quot, i)

if (exceptionOccurred(ee))

return 00 / / Необхідно щось повернути

/ * . Обчислення .. * /

}

return result

}

У фрагменті програми, що передує циклу, ми отримуємо дескриптор обєкта javaioPrintStream  для Systemout Ми не можемо безпосередньо використовувати значення статичного поля Systemout, Тому що статичні поля не мають свого представлення в рідних методах через це доводиться вдаватися до обхідних маневрів У даному випадку ми створюємо статичний метод, який повертає потрібне значення, і викликаємо його з рідного методу:

public static javaioPrintStream outStream() {

return Systemout

}

Рідний код повинен отримати покажчик на структуру ClassClass для класу Crunch, Тому ми викликаємо FindClass Після цього можна викликати функцію execute_java_static_method із зазначенням імені викликається методу і його сигнатури, що включає тип значення Ми перетворимо повертається значення long до типу, необхідному для конкретного методу У даному випадку нам потрібен загальний дескриптор HObject, А не дескриптор для конкретного типу javaioPrintStream

Після виклику методу перевіряється, чи не було порушено виняток Це варто робити після кожного виклику методу або конструктора Java з рідного коду, оскільки в іншому випадку ви можете пропустити виняток і мати неприємності в майбутньому Якщо ми виходимо з функції з причини виникнення виключення, то повертається фіктивне значення, яке ігнорується програмою

Після того, як отриманий доступ до вихідного потоку, можна починати циклічні обчислення При проході кожного циклу його номер виводиться методом Systemoutprintln Для виклику цього методу ми використовуємо функція execute_java_dynamic_method, Передаючи їй як параметри обєкт, для якого викликається метод, імя методу, його сигнатуру і аргументи Нам потрібна версія println, Яка отримує аргумент типу int цей метод має тип void, Тому ми використовуємо сигнатуру (I)V&quot і передаємо ціле число, яке потрібно вивести (i) Після аргументу-сигнатури І знову при поверненні з методу необхідно перевірити, чи не чи порушено виняток

Для багатьох типів, що повертаються методами Java, приведення long до потрібного типу відбувається елементарно Однак типи double і long в Java є 64-розрядними, тоді як у більшості існуючих компіляторів C тип long 32-розрядний, і тому повертається значення буде мати тільки половинну довжину Хоча існують

різні способи отримання всіх 64 біт значення, що повертається, про них не йдеться в цій книзі через їх машинної залежності

А8 Останнє попередження

Ми повинні знову попередити вас про те, що конкретна схема стикування, описана тут, в майбутньому обовязково зміниться Поліпшення можуть відбутися як в плані реалізації, так і на концептуальному рівні Схема стикування з C + + володітиме іншими характеристиками, і, можливо, спричинить за собою зміни в схемі стикування з C, зберігаючи, однак, сумісність Крім того, творці майбутніх середовищ розробки можуть взагалі відмовитися від використання всіх принципів, застосованих у даній схемі Ми сподіваємося, що в кожному разі наведений тут матеріал допоможе вам зрозуміти деякі загальні аспекти, що виникають при стикуванні різних мов програмування, і освоїти схему звязування рідних методів, яка використовуватиметься у вашій системі

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*