Добавление VTK в проект Android Studio 3.3 с помощью NDK r17c - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь добавить VTK в свой родной проект Android в AS 3.3.Я установил NDK R17C.Я хотел бы использовать некоторые функции VTK в своем родном приложении.Кроме того, я использую gradle 3.3.2 для сборки моего проекта android и CMake 3.6.4 для сборки собственной части проекта.Моя проблема в том, что я не нашел подходящего учебника (я новичок в нативной разработке для Android) для импорта VTK в Android Studio, используя все инструменты сборки, которые я описал.Есть способ сделать это?Кроме того, я хотел бы добавить, что я использую ОС Windows 7.

РЕДАКТИРОВАТЬ: я обновил свой файл CMakeLists.txt с некоторыми строками, которые я нашел соответствующие в официальном примере (https://github.com/Kitware/VTK/tree/master/Examples/Android). Iхотел бы использовать VTK внутри моей библиотеки native-lib:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)



# 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 them for you.
# Gradle automatically packages shared libraries with your APK.

link_directories(src/main/jni/japi src/main/jni/acquisition)

file(GLOB native_SRC
        "src/main/jni/japi/*.h"
        "src/main/jni/japi/*.cpp"
        )

add_library( # Sets the name of the library.
        native-lib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        ${native_SRC})


file(GLOB acquisition_SRC
        "src/main/jni/acquisition/*.h"
        "src/main/jni/acquisition/*.cpp"
        )
#file(GLOB acquisition_SRC
#        "src/main/jni/acquisition/*.h"
#        )

add_library( acquisition-lib STATIC ${acquisition_SRC})
#add_library(
#        acquisition-lib
#
#        STATIC
#
#        src/main/jni/acquisition/test-lib.h
#        src/main/jni/acquisition/test-lib.cpp)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries 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( # Sets the name of the path variable.
          log-lib

          # Specifies the name of the NDK library that
          # you want CMake to locate.
          log )

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

target_link_libraries( # Specifies the target library.
           native-lib

           # Links the target library to the log library
           # included in the NDK.
           ${log-lib})

target_link_libraries( native-lib acquisition-lib )

set(OpenCV_DIR "../opencv/src/sdk/native/jni")
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV libraries: ${OpenCV_LIBS}")
target_link_libraries(native-lib ${OpenCV_LIBS})
target_link_libraries(acquisition-lib ${OpenCV_LIBS})
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--exclude-libs,libippicv.a -Wl,--exclude-libs,libippiw.a")



##ADDED for including the VTK

find_package(VTK COMPONENTS
        vtkInteractionStyle
        vtkRenderingOpenGL2
        vtkRenderingFreeType
        vtkTestingCore
        vtkTestingRendering
        )
include(${VTK_USE_FILE})

target_link_libraries( native-lib ${VTK_LIBRARIES} )

Ответы [ 2 ]

0 голосов
/ 25 мая 2019

Хорошо, у меня ушло около недели, чтобы это заработало, но оно окупилось. Я перечислю все, что мне нужно было сделать, чтобы использовать VTK в моем приложении для Android.

ШАГ 1: Сборка VTK на компьютере с Linux

Поскольку Android основан на ОС Linux, вам необходимо создавать библиотеки в формате .a или .so. Для этого проще всего собрать VTK на Linux-машине. Таким образом, вы должны установить Linux на свою машину как двойную загрузку или, как в моем случае, установить виртуальную машину под управлением Linux.

После этого вам необходимо установить все необходимое для загрузки и сборки VTK для Android. Вот список того, что вам нужно скачать и установить на ваш компьютер с Linux:

  1. Загрузка и установка Android NDK - я скачал ту же версию, которую использую в своей Android Studio - r17c
  2. Загрузите и установите Android SDK, т.е. Android Studio
  3. Загрузите и установите ANT
  4. Скачать и установить Java
  5. Скачайте и установите CMake - также после того, как я его установил, мне нужно было запустить: sudo apt-get update && sudo apt-get install build-essential
  6. Скачать и установить Git
  7. Установить OpenGL - я использовал: sudo apt-get install freeglut3-dev
  8. Определить ANDROID_NDK переменную среды - укажите ее в разархивированной папке Android NDK
  9. Определить ANT_HOME переменную среды - укажите ее в разархивированной папке ANT
  10. Определить JAVA_HOME переменную среды - укажите ее в разархивированной папке Java JRE
  11. Определить ANDROID_SDK переменную среды - укажите ее расположение на папке Android / Sdk
  12. Define CMAKE_HOME переменная окружения - укажите ее местоположение установленного CMake
  13. Добавить к PATH Переменная среды: ANT_HOME/bin, JAVA_HOME/bin, ANDROID_SDK/platform-tools, ANDROID_SDK/tools, CMAKE_HOME/bin

После установки всех вышеперечисленных инструментов вам необходимо скачать исходный код VTK с помощью git:

  1. Создать папку 'vtk' где-нибудь
  2. cd vtk
  3. git clone https://github.com/Kitware/VTK.git

Теперь вы можете пойти и построить VTK:

  1. mkdir vtk/vtk-android
  2. cd vtk-android
  3. ccmake ../VTK
  4. нажмите c (настроить)
  5. нажмите c (настроить)
  6. нажмите q (выйти)
  7. cmake -DVTK_ANDROID_BUILD=ON -DANDROID_NATIVE_API_LEVEL=23 -DANDROID_ARCH_ABI=arm64-v8a ../VTK - здесь я определил уровень 23 api, потому что это то, что я использую в своем приложении. Кроме того, здесь вы определяете архитектуру ABI ваших целевых устройств. У меня устройство arm64-v8a, поэтому я его использую. Чтобы построить VTK для других архитектур, вам нужно будет построить каждую из них. Кроме того, вы можете изменить это на следующем шаге!
  8. ccmake ../VTK
  9. ДОПОЛНИТЕЛЬНО: на этом этапе вы можете определить дополнительные модули, которые вам нужны в вашем приложении. Если вы просто пропустите этот шаг, вы получите следующие модули (.a файлы):

    vtkCommonColor, vtkCommonComputationalGeometry, vtkCommonCore,
    vtkCommonDataModel, vtkCommonExecutionModel, vtkCommonMath, vtkCommonMisc,
    vtkCommonSystem, vtkCommonTransforms, vtkDICOMParser, vtkdoubleconversion, vtkexpat, vtkFiltersCore, vtkFiltersExtraction, vtkFiltersGeneral, vtkFiltersGeometry, vtkFiltersHybrid, vtkFiltersModeling, vtkFiltersSources, vtkFiltersStatistics, vtkfreetype, vtkglew, vtkImagingCore, vtkImagingFourier, vtkImagingMath, vtkImagingSources, vtkInfovisCore, vtkInteractionStyle, vtkIOCore vtkIOGeometry, vtkIOImage, vtkIOInfovis, vtkIOLegacy, vtkIOPLY, vtkIOXML, vtkIOXMLParser, vtkjpeg, vtkjsoncpp, vtklibxml2, vtklz4, vtklzma, vtkmetaio, vtkParallelCore, vtkpng, vtkRenderingCore, vtkRenderingFreeType, vtkRenderingOpenGL2, vtkRenderingVolume, vtkRenderingVolumeOpenGL2, vtksys, vtkTestingRendering, vtktiff, vtkWrappingTools, vtkzlib

Если этих модулей вам недостаточно, вам нужно добавить несколько строк в файл VTK / CMake / vtkAndroid.cmake, потому что там определена сборка для android. Добавляемые строки должны выглядеть следующим образом:

-DVTK_MODULE_ENABLE_VTK_[name-of-the-module]:STRING=YES

Вы можете найти все возможные значения name-of-the-module, если нажмете t (переключить) и выделите часть конфигурации VTK_MODULE_ENABLE_VTK _...

  1. c (настроить)
  2. г (генерировать)
  3. make

Итак, процесс сборки начинается. На моем ноутбуке это заняло ~ 30 минут (я выделил 3 ГБ ОЗУ для виртуальной машины).

ШАГ 2: Импорт VTK в Android Studio

После завершения процесса сборки вам необходимо скопировать папку vtk/vtk-android/CMakeExternals/Install/vtk-android на ваш компьютер с Windows. Папка lib содержит библиотеку VTK для сборки в виде набора статических библиотек (файлы .a), а папка include содержит все заголовочные файлы VTK, которые необходимы вам для полной работы VTK.

Теперь в своем проекте Android Studio создайте новый модуль Android Library под названием vtk. Создайте папку src/main/jni и внутри этой папки скопируйте папку lib и include, описанную выше.

В папке jni хранится файл vtk-lib.cpp, который будет служить интерфейсом от вашего Java-кода к библиотеке VTK. Примером может быть:

#include <jni.h>
#include <vtkConeSource.h>

extern "C"
JNIEXPORT void JNICALL
Java_link_to_your_java_function(
        JNIEnv *env,
        jobject /*this*/) {

    vtkConeSource *cone = vtkConeSource::New();
    cone->SetHeight(3.0);
    cone->Delete();

}

В файле build.gradle вашего модуля vtk добавьте следующие строки:

android {
    ...

    defaultConfig {
        ...

        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
                arguments "-DANDROID_CPP_FEATURES=rtti exceptions",
                        "-DANDROID_STL=gnustl_shared"
                abiFilters 'arm64-v8a'
            }
        }
    }

    ...

    externalNativeBuild {
        cmake {
            path "src/main/jni/CMakeLists.txt"
        }
    }
}

После этого в папку jni добавьте файл CMakeLists.txt, который будет использоваться для сборки модуля:

cmake_minimum_required(VERSION 3.4.1)

set(LIB_DIR ${PROJECT_SOURCE_DIR}/lib/${ANDROID_ABI})

add_library(vtk-common-color STATIC IMPORTED)
set_target_properties(vtk-common-color
    PROPERTIES IMPORTED_LOCATION
    ${LIB_DIR}/libvtkCommonColor-8.90.a)

#53 more libraries from lib folder

add_library( vtk-lib SHARED ${PROJECT_SOURCE_DIR}/vtk-lib.cpp)

target_include_directories(vtk-lib PRIVATE ${PROJECT_SOURCE_DIR}/include)

target_link_libraries(
    vtk-lib
    -Wl,--start-group -L ${TARGET_OUT}
    vtk-common-color
    #53 more libraries names
    -Wl,--end-group
)

И это все, вуаля!

0 голосов
/ 16 мая 2019

Вы можете начать с официального примера на GitHub :

NativeVTK построен на основе собственного интерфейса Android и не имеет никакого кода Java, связанного с ним.Любые неиспользуемые элементы интерфейса должны быть созданы в C ++ с использованием обычных виджетов VTK или других элементов OpenGL.Это лучше всего подходит для приложений, которые в основном ориентированы на рендеринг или визуализацию с минимальным пользовательским интерфейсом.В этом примере весь код ключа находится в jni / main.cxx, и он будет очень похож на обычный код VTK, к которому вы привыкли.

Он не использует Android Studio, и для хорошего!Загрузка огромного количества стороннего кода в Android Studio бесполезна и разочаровывает.Гораздо лучше иметь такие библиотеки, скомпилированные с их собственными инструментами сборки, и импортировать только небольшие модули, которые требуют большого количества изменений и / или интерактивной отладки.

...