Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для продвинутых пользователей
                Как собрать jNavigation Recast Bindings

Как собрать jNavigation Recast Bindings

Опубликованно: 06.07.2017, 15:38
Последняя редакция, Andry: 07.07.2017 10:17

jNavigation — это Java jME порт для Recast Navigation, написанной на C++. Проект состоит из двух частей:

  1. JNavigationNative содержит библиотеку Recast Navigation и оболочку C++ для java
  2. JNavigation — проект Java, который использует jNavigationNative и является проектом, который будет использовать конечный пользователь

Если необходимо обновить Recast Navigation со стороны native, существует два типа привязок обновления:

  1. Только обновление методов, что бы сделать Recast более эффективным или более точным
  2. Добавление новых методов для использования в Recast

Обновление Методов

Только обновить методы достаточно просты. Вам потребуется:

  1. С++ компилятор

JNavigationNative, который имеет следующие папки и файлы (у него их больше, но эти наиболее важны на данный момент):

  • Recast
    • Include
    • Source
  • README.md
  • Recast_wrap.cxx — Java — C++ оболочка

Обновление методов заключается только в том, чтобы поместить все заголовки из Recast Navigation в папку Include, исходники в папку Source» и затем собрать проект.

Поскольку автор этого проекта использовал NetBeans 7.4 для сборки проекта, в него включается следующая инструкция, если сборка из терминала не работает.

  1. Настройка параметров для компилятора в NetBeans
  2. Удалите все заголовки из файлов заголовков
  3. Удалите все исходные файлы EXCEPT Recast_wrap.cxx из Source файлов
  4. Щелкните правой кнопкой мыши на файлах заголовков, выберите Add Existing Item… или Add Existing Items from Folders… и выберите нужные заголовки
  5. Щелкните правой кнопкой мыши Source файлы, выберите Add Existing Item… или Add Existing Items from Folders… и выберите необходимые файлы исходники
  6. Соберите
  7. Добавите сборку проект в проект jNavigation
  8. Соберите проект jNavigation.

Добавление новых методов со стороны native

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

  • Ручное добавление кода в оболочку
  • Создание новой обертки с помощью SWIG

Ручное добавление кода в оболочку

Пример метода в оболочке:

SWIGEXPORT jint JNICALL Java_com_jme3_ai_navigation_utils_RecastJNI_rcIntArray_1size(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) {
 ...
}

Recast_wrap.cxx использует SWIG-оболочку, поэтому для объявления метода в оболочке вы должны сначала использовать ключевое слово SWIGEXPORT, после чего возвращаете тип (для получения дополнительной информации о возвращаемых типах см. Ссылку), затем снова ключевое слово JNICALL, а затем название метода Java_com_jme3_ai_navigation_utils_RecastJNI_ + название класса + название метода, после чего идет список параметров, необходимых для функции (для получения дополнительной информации см. Ссылку). В теле метода напишите, как должна использоваться функция.

После добавления метода в оболочку скомпилируйте проект и добавьте его в jNavigation. В проекте jNavigation в классе com.jme3.ai.navigation.utils.RecastJNI.java добавьте native метод, а после этого добавьте в класс, из которого вы хотели бы использовать этот метод, чтобы вызвать этот native метод. Это кажется немного сложнее, чем должно быть, но тут также делается поддержка обновления со стороны native с помощью SWIG.

Создание новой оболочки с помощью SWIG

В какую-нибудь временную папку добавьте все заголовки. Она не должен содержать никаких подпапок.

Для создания оболочки использовался следующий скрипт:

%module Recast
%include "carrays.i"
%array_class(double, DoubleArray);
%array_class(float, FloatArray);
%array_class(int, IntArray);
%array_class(unsigned char, UCharArray);
%array_class(unsigned short, UShortArray);
%array_class(unsigned int, UIntArray);
%array_class(long, LongArray);
%array_class(bool, BooleanArray)

%{
#include "DetourAlloc.h"
#include "DetourAssert.h"
#include "DetourCommon.h"
#include "DetourCrowd.h"
#include "DetourLocalBoundary.h"
#include "DetourMath.h"
#include "DetourNavMesh.h"
#include "DetourNavMeshBuilder.h"
#include "DetourNavMeshQuery.h"
#include "DetourNode.h"
#include "DetourObstacleAvoidance.h"
#include "DetourPathCorridor.h"
#include "DetourPathQueue.h"
#include "DetourProximityGrid.h"
#include "DetourStatus.h"
#include "DetourTileCache.h"
#include "DetourTileCacheBuilder.h"
#include "Recast.h"
#include "RecastAlloc.h"
#include "RecastAssert.h"
%}

/* Давайте просто возьмем исходный заголовочный файл здесь */
%include "DetourAlloc.h"
%include "DetourAssert.h"
%include "DetourCommon.h"
%include "DetourCrowd.h"
%include "DetourLocalBoundary.h"
%include "DetourMath.h"
%include "DetourNavMesh.h"
%include "DetourNavMeshBuilder.h"
%include "DetourNavMeshQuery.h"
%include "DetourNode.h"
%include "DetourObstacleAvoidance.h"
%include "DetourPathCorridor.h"
%include "DetourPathQueue.h"
%include "DetourProximityGrid.h"
%include "DetourStatus.h"
%include "DetourTileCache.h"
%include "DetourTileCacheBuilder.h"
%include "Recast.h"
%include "RecastAlloc.h"
%include "RecastAssert.h"

%pragma(java) jniclasscode=%{
  static {
    System.load("Recast");
  }
%}

Если вдруг заголовков окажется больш, то добавьте новые в оба места.

  1. Сохраните скрипт как Recast.i во временную папку с остальными заголовками
  2. Установите SWIG, если он еще не установлен
  3. Откройте терминал и перейдите в папку, где лежит скрипт
  4. Выполнить команду swig -c++ -java Recast.i
  5. Теперь SWIG сгенерирует классы Java и новый Recast_wrap.cxx
  6. Recast_wrap.cxx помещаем в jNavigationNative с новыми заголовками и исходными файлами, как упоминалось ранее
  7. Собираем этот проект
  8. Со стороны jNavigation добавьте только новые методы в RecastJNI и используйте их там где они вам нужны. Для этого вы можете увидеть его в Java-классе, которые собрали с помощью SWIG.
  9. Если метод использует определенный SWIG-тип, попробуйте использовать какой-либо метод для его преобразования в тип jME или аналогичный. Вероятно, вам сможет в этом помочь что-нибудь в пакете com.jme3.ai.navigation.utils

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.