Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сборка OpenSceneGraph под Android в среде MS Windows
GAMEINATOR forums > Soft, Hard и периферия > Hard & Soft
autistic
Ни для кого не секрет, что разработка под мобильные устройства, особенно если речь идет о разработке высокопроизводительных приложений реального времени, дело сложное и трудоемкое, поэтому естественным и очевидным решением было бы использование по максимуму качественных и надежных библиотек с открытым исходным кодом, особенно в условиях ограниченного времени. Однако, стоит заметить, что отличительной особенностью открытого кода является сложность сборки под различные платформы различным инструментарием, в условиях отсутствия вменяемой документации и с учетом того, что многие библиотеки возможно никогда не собирались под интересующую вас платформу вообще.

Одной из таких библиотек является OpenSceneGraph, это высокопроизводительный трехмерный графический движок с открытым исходным кодом который имеет множество применений в самых различных областях: компьютерных играх, виртуальной реальности, науке, геоинформационных системах и пр. В этом сообщении я хочу поделиться опытом сборки этой библиотеки под операционную систему Android в среде Microsoft Windows.

Итак, покопавшись на официальном сайте, в разделе FAQ, мне удалось найти три инструкции, посвященные сборке под эту платформу, к сожалению часть из них описывает сборку в среде unix-like операционных систем, а часть устарела с выходом свежих версий Android NDK, поэтому пришлось потратить изрядное кол-во времени и нервов чтобы воспроизвести этот процесс по шагам:
1. Для начала нам потребуется установить свежие версии Android NDK и Android Studio последняя уже включает Android SDK, поэтому устанавливать его отдельно не нужно. Также нам понадобится система сборки CMake, однако не спешите устанавливать ее с офф. сайта, нам потребуется версия, установленная при помощи Android Studio из меню Tools->Android->SDK Manager

2. Далее, необходимо определиться с директориями, куда мы поместим исходный код OpenSceneGraph, объектные файлы библиотек, полученные в результате его сборки и собственно наш проект-болванку, на моей машине эти пути имеют следующий вид:
Код
D:\programs\Android\android-ndk-r13 - корневой каталог Android NDK
D:\programs\Android\sdk - корневой каталог Android SDK
D:\projects\OpenSceneGraph - папка с исходным кодом OpenSceneGraph
D:\projects\OpenSceneGraph\build-android - каталог сборки в который будут сгенерированы сборочные скрипты
D:\projects\OpenSceneGraph\osg-android - каталог установки, в который будут скопированы заголовочные файлы и скомпилированные файлы библиотек


3. Затем необходимо создать соответствующие переменные окружения, которые потребуются позже.
Код
set ANDROID_NDK=D:\programs\Android\android-ndk-r13
set ANDROID_SDK=D:\programs\Android\sdk
set OSG_PATH=D:\projects\OpenSceneGraph


4. Теперь нам потребуются исходники OpenSceneGraph 3.4.0, их можно скачать с официального сайта или подтянуть из репозитория при помощи команды git
Код
git clone --branch OpenSceneGraph-3.4.0 https://github.com/openscenegraph/OpenSceneGraph.git


5. Конфигурируем скрипт сборки, для этого перемещаемся в каталог сборки, который мы определили выше, и выполняем в консоли следующую команду:
Код
%ANDROID_SDK%/cmake/3.6.3155560/bin/cmake -G "MinGW Makefiles" -DCMAKE_CXX_FLAGS="-frtti -fexceptions" \
    -DCMAKE_MAKE_PROGRAM=%ANDROID_NDK%/prebuilt/windows-x86_64/bin/make.exe \
    -DCMAKE_TOOLCHAIN_FILE=%ANDROID_SDK%/cmake/3.6.3155560/android.toolchain.cmake \
    -DCMAKE_INSTALL_PREFIX=../osg-android -DOPENGL_PROFILE="GLES2" \
    -DDYNAMIC_OPENTHREADS=OFF -DDYNAMIC_OPENSCENEGRAPH=OFF \
    -DANDROID_NDK=D:/programs/Android/android-ndk-r13 \
    -DANDROID_TOOLCHAIN=clang -DANDROID_ABI=armeabi-v7a \
    -DANDROID_PLATFORM=android-15 -DANDROID_NDK_REVISION=13 ..

Здесь для удобства чтения я использовал мультистрочное форматирование, которое не работает в консоли Windows, поэтому в консоль команду нужно вставлять одной строкой.

8. Собираем OpenSceneGraph (обратите внимание, что сборка осуществляется только под архитектуру armeabi-v7a)
Код
%ANDROID_NDK%/prebuilt/windows-x86_64/bin/make.exe install


7. Теперь нужно сгенерировать в Android Studio новый проект с поддержкой C++. Мастер настройки достаточно простой, поэтому не буду подробно расписывать этот процесс.

8. В текущей версии Android Studio, есть досадный дефект, необходимо вручную дописать путь к NDK, в файле local.properties. Этот файл можно найти в дереве проекта, в секции Gradle Scripts

9. Найдем в дереве проекта, в секции Gradle Scripts, файл build.gradle нашего app и отредактируем в нем секцию externalNativeBuild следующим образом
Код
externalNativeBuild {
        cmake {
            cppFlags "-std=c++11 -frtti -fexceptions"
            arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_ABI=armeabi-v7a"
        }
}


10. Отредактируем CMakeLists.txt нашего проекта-болванки, для этого найдем его в дереве проекта, в секции External Build Files, и приведем к следующему виду:
Код
# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.

cmake_minimum_required(VERSION 3.4.1)

set( OSG_PATH $ENV{OSG_PATH} )
set( OSG_INCLUDE ${OSG_PATH}/osg-android/include )
set( OSG_LIB ${OSG_PATH}/osg-android/lib )
set( OSG_PLUGINS ${OSG_LIB}/osgPlugins-3.4.0 )

include_directories( ${OSG_INCLUDE} )
link_directories( ${OSG_LIB} )
link_directories( ${OSG_PLUGINS} )

add_library( osgdb_dds STATIC IMPORTED GLOBAL )
add_library( osgdb_openflight STATIC IMPORTED GLOBAL )
add_library( osgdb_tga STATIC IMPORTED GLOBAL )
add_library( osgdb_rgb STATIC IMPORTED GLOBAL )
add_library( osgdb_osgterrain STATIC IMPORTED GLOBAL )
add_library( osgdb_osg STATIC IMPORTED GLOBAL )
add_library( osgdb_ive STATIC IMPORTED GLOBAL )
add_library( osgdb_deprecated_osgviewer STATIC IMPORTED GLOBAL )
add_library( osgdb_deprecated_osgvolume STATIC IMPORTED GLOBAL )
add_library( osgdb_deprecated_osgtext STATIC IMPORTED GLOBAL )
add_library( osgdb_deprecated_osgterrain STATIC IMPORTED GLOBAL )
add_library( osgdb_deprecated_osgsim STATIC IMPORTED GLOBAL )
add_library( osgdb_deprecated_osgshadow STATIC IMPORTED GLOBAL )
add_library( osgdb_deprecated_osgparticle STATIC IMPORTED GLOBAL )
add_library( osgdb_deprecated_osgfx STATIC IMPORTED GLOBAL )
add_library( osgdb_deprecated_osganimation STATIC IMPORTED GLOBAL )
add_library( osgdb_deprecated_osg STATIC IMPORTED GLOBAL )
add_library( osgdb_serializers_osgvolume STATIC IMPORTED GLOBAL )
add_library( osgdb_serializers_osgtext STATIC IMPORTED GLOBAL )
add_library( osgdb_serializers_osgterrain STATIC IMPORTED GLOBAL )
add_library( osgdb_serializers_osgsim STATIC IMPORTED GLOBAL )
add_library( osgdb_serializers_osgshadow STATIC IMPORTED GLOBAL )
add_library( osgdb_serializers_osgparticle STATIC IMPORTED GLOBAL )
add_library( osgdb_serializers_osgmanipulator STATIC IMPORTED GLOBAL )
add_library( osgdb_serializers_osgfx STATIC IMPORTED GLOBAL )
add_library( osgdb_serializers_osganimation STATIC IMPORTED GLOBAL )
add_library( osgdb_serializers_osg STATIC IMPORTED GLOBAL )
add_library( osgViewer STATIC IMPORTED GLOBAL )
add_library( osgVolume STATIC IMPORTED GLOBAL )
add_library( osgTerrain STATIC IMPORTED GLOBAL )
add_library( osgText STATIC IMPORTED GLOBAL )
add_library( osgShadow STATIC IMPORTED GLOBAL )
add_library( osgSim STATIC IMPORTED GLOBAL )
add_library( osgParticle STATIC IMPORTED GLOBAL )
add_library( osgManipulator STATIC IMPORTED GLOBAL )
add_library( osgGA STATIC IMPORTED GLOBAL )
add_library( osgFX STATIC IMPORTED GLOBAL )
add_library( osgDB STATIC IMPORTED GLOBAL )
add_library( osgAnimation STATIC IMPORTED GLOBAL )
add_library( osgUtil STATIC IMPORTED GLOBAL )
add_library( osg STATIC IMPORTED GLOBAL )
add_library( OpenThreads STATIC IMPORTED GLOBAL )

set_target_properties( osgdb_dds PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_dds.a )
set_target_properties( osgdb_openflight PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_openflight.a )
set_target_properties( osgdb_tga PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_tga.a )
set_target_properties( osgdb_rgb PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_rgb.a )
set_target_properties( osgdb_osgterrain PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_osgterrain.a )
set_target_properties( osgdb_osg PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_osg.a )
set_target_properties( osgdb_ive PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_ive.a )
set_target_properties( osgdb_deprecated_osgviewer PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_deprecated_osgviewer.a )
set_target_properties( osgdb_deprecated_osgvolume PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_deprecated_osgvolume.a )
set_target_properties( osgdb_deprecated_osgtext PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_deprecated_osgtext.a )
set_target_properties( osgdb_deprecated_osgterrain PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_deprecated_osgterrain.a )
set_target_properties( osgdb_deprecated_osgsim PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_deprecated_osgsim.a )
set_target_properties( osgdb_deprecated_osgshadow PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_deprecated_osgshadow.a )
set_target_properties( osgdb_deprecated_osgparticle PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_deprecated_osgparticle.a )
set_target_properties( osgdb_deprecated_osgfx PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_deprecated_osgfx.a )
set_target_properties( osgdb_deprecated_osganimation PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_deprecated_osganimation.a )
set_target_properties( osgdb_deprecated_osg PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_deprecated_osg.a )
set_target_properties( osgdb_serializers_osgvolume PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_serializers_osgvolume.a )
set_target_properties( osgdb_serializers_osgtext PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_serializers_osgtext.a )
set_target_properties( osgdb_serializers_osgterrain PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_serializers_osgterrain.a )
set_target_properties( osgdb_serializers_osgsim PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_serializers_osgsim.a )
set_target_properties( osgdb_serializers_osgshadow PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_serializers_osgshadow.a )
set_target_properties( osgdb_serializers_osgparticle PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_serializers_osgparticle.a )
set_target_properties( osgdb_serializers_osgmanipulator PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_serializers_osgmanipulator.a )
set_target_properties( osgdb_serializers_osgfx PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_serializers_osgfx.a )
set_target_properties( osgdb_serializers_osganimation PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_serializers_osganimation.a )
set_target_properties( osgdb_serializers_osg PROPERTIES IMPORTED_LOCATION ${OSG_PLUGINS}/libosgdb_serializers_osg.a )
set_target_properties( osgViewer PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgViewer.a )
set_target_properties( osgVolume PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgVolume.a )
set_target_properties( osgTerrain PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgTerrain.a )
set_target_properties( osgText PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgText.a )
set_target_properties( osgShadow PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgShadow.a )
set_target_properties( osgSim PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgSim.a )
set_target_properties( osgParticle PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgParticle.a )
set_target_properties( osgManipulator PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgManipulator.a )
set_target_properties( osgGA PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgGA.a )
set_target_properties( osgFX PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgFX.a )
set_target_properties( osgDB PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgDB.a )
set_target_properties( osgAnimation PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgAnimation.a )
set_target_properties( osgUtil PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosgUtil.a )
set_target_properties( osg PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libosg.a )
set_target_properties( OpenThreads PROPERTIES IMPORTED_LOCATION ${OSG_LIB}/libOpenThreads.a )


# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds it for you.
# Gradle automatically packages shared libraries with your APK.

add_library(
    native-lib
     SHARED
    src/main/cpp/native-lib.cpp
)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because system libraries are included in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( log-lib log )
find_library( egl-lib EGL )
find_library( gles2-lib GLESv2 )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in the
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries(
    native-lib
    osgdb_dds
    osgdb_openflight
    osgdb_tga
    osgdb_rgb
    osgdb_osgterrain
    osgdb_osg
    osgdb_ive
    osgdb_deprecated_osgviewer
    osgdb_deprecated_osgvolume
    osgdb_deprecated_osgtext
    osgdb_deprecated_osgterrain
    osgdb_deprecated_osgsim
    osgdb_deprecated_osgshadow
    osgdb_deprecated_osgparticle
    osgdb_deprecated_osgfx
    osgdb_deprecated_osganimation
    osgdb_deprecated_osg
    osgdb_serializers_osgvolume
    osgdb_serializers_osgtext
    osgdb_serializers_osgterrain
    osgdb_serializers_osgsim
    osgdb_serializers_osgshadow
    osgdb_serializers_osgparticle
    osgdb_serializers_osgmanipulator
    osgdb_serializers_osgfx
    osgdb_serializers_osganimation
    osgdb_serializers_osg
    osgViewer
    osgVolume
    osgTerrain
    osgText
    osgShadow
    osgSim
    osgParticle
    osgManipulator
    osgGA
    osgFX
    osgDB
    osgAnimation
    osgUtil
    osg
    OpenThreads
    ${log-lib}
    ${egl-lib}
    ${gles2-lib}
)


Вуаля! Проект собирается, устанавливается на устройство и запускается. Если вы все сделали верно, то на экране вашего мобильного устройства должно появиться окно с надписью "Hello from C++".
putnik
I have tried it. (Windows 7 64-bit, Android Studio 2.2.3, DANDROID_PLATFORM=android-19.)
I add code:
osg::Node* loadedModel = osgDB::readNodeFile(filename);
Method osgDB::readNodeFile returns NULL.
Please, have you some suggestion, what is reason of "dysfunctional" code?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.