Главная » Разработка для Android » НАТИВНЫЕ МЕТОДЫ И ВЫЗОВЫ НАТИВНОГО ИНТЕРФЕЙСА JAVA (JNI) в Android приложении

0

 

JNI требует следовать определенным соглашениям, чтобы можно было делать вызовы методов из других языков. Нативные методы (в сущности, относящиеся к библиотекам С или С++) претерпевают при этом более серьезные изменения, чем код Java.

Соглашения на стороне нативных методов

Когда VM (виртуальная машина, в случае с Android это Dalvik) активирует функцию, реализованную на языке С или С++, машина передает функции два специальных параметра:

указатель JNIEnv, своего рода описатель того потока, в котором виртуальная машина вызывает нативный метод;

указатель jobject, представляющий собой ссылку на вызывающий класс.

Эти параметры явно передаются коду Java. Это означает, что они не упоминаются в сигнатуре метода, объявляемого в вызывающем коде Java. Вызов Java просто явно передает все остальные параметры, которые нужны для работы вызванной функции.

Функция JNI может иметь следующий вид:

В этих примерах показаны два параметра, которые автоматически передаются каждому нативному методу, и два параметра с типами, отображаемыми на типы Java.

При вызове нативного метода данный метод выполняет тот же процесс и тот же поток, что и код Java, вызывающий его. Как будет показано далее, он может выделять память из кучи Java, чтобы пользоваться преимуществами, связанными со сборкой мусора, а также брать память вне кучи Java, чтобы обходить систему управления памятью, действующую в Java. Стековые переменные из кода на С или С++ имеют ту же семантику, что и в нативных исполняемых модулях на этих языках. Они размещаются в стеке того процесса, в котором работают.

В JNI предоставляются типы, соответствующие типам Java, как показано в табл. 18.1.

Таблица 18.1. Отображение данных

В составных типах – таких как объекты, массивы и строки – нативный код должен явно преобразовывать данные, вызывая методы преобразования, доступные через указатель JNI Env.

Соглашения на стороне Java

Перед тем как нативные методы можно будет использовать в классе Java, нужно загрузить библиотеку с нативными методами. Для этого требуется вызвать System. loadLibrагу. Как правило, тот класс, которому требуется нативный метод, статически ее загружает. Нативные методы, к которым обращается класс, объявляются в классе при помощи ключевого слова native:

Источник: Android. Программирование на Java для нового поколения мобильных устройств

По теме:

  • Комментарии