1

我正在尝试将 VTK 添加到我在 AS 3.3 中的原生 Android 项目中。我已经安装了 NDK r17c。我想在我的本机应用程序中使用一些 VTK 功能。另外,我正在使用 gradle 3.3.2 来构建我的 android 项目,并使用 CMake 3.6.4 来构建项目的本机端。我的问题是我还没有找到合适的教程(我是 Android 原生开发的新手)使用我描述的所有构建工具将 VTK 导入 Android Studio。有没有办法做到这一点?另外,我想补充一点,我使用的是 Windows 7 操作系统。

编辑:我已经用我在官方示例( https://github.com/Kitware/VTK/tree/master/Examples/Android)中发现的一些行更新了我的 CMakeLists.txt 文件。我想在我的 native-lib 库中使用 VTK:

# 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} )
4

2 回答 2

1

好的,我花了大约一周的时间才完成这项工作,但它得到了回报。我将列出我需要做的所有事情才能在我的 android 应用程序中使用 VTK。

步骤 1:在 Linux 机器上构建 VTK

由于 Android 是基于 Linux 操作系统的,因此您需要构建库格式.a.so格式。为此,最简单的方法是在 Linux 机器上构建 VTK。因此,您必须将 Linux 作为双引导安装到您的机器上,或者像我一样,安装一个运行 Linux 的虚拟机。

之后,您需要安装下载和构建 VTK for 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. 定义CMAKE_HOME环境变量 - 将其指向您安装的 CMake 的位置
  13. 添加到PATH环境变量:ANT_HOME/bin, JAVA_HOME/bin, ANDROID_SDK/platform-tools, ANDROID_SDK/tools,CMAKE_HOME/bin

以上所有需要的工具都安装好后,需要使用git下载VTK源码:

  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,您需要为每个架构构建 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. g(生成)
  3. make

好的,构建过程开始了。在我的笔记本电脑上花了大约 30 分钟(我为虚拟机分配了 3GB 的 RAM)。

第 2 步:将 VTK 导入 Android Studio

构建过程完成后,您需要将该文件夹复制vtk/vtk-android/CMakeExternals/Install/vtk-android到您的 Windows 计算机。该文件夹lib包含作为一组静态库(.a 文件)的构建 VTK 库,该文件夹include包含使 VTK 完整工作所需的所有 VTK 头文件。

现在,在您的 Android Studio 项目中,创建一个名为vtk. 创建src/main/jni文件夹并在该文件夹中复制上述的libandinclude文件夹。

jni文件夹 crate 中,有一个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
)

就是这样,瞧!

于 2019-05-25T12:17:08.250 回答
0

您可以从GitHub 上的官方示例开始:

NativeVTK 是围绕 Android 原生接口构建的,并且没有任何与之关联的 Java 代码。任何 unser 界面元素都需要使用常规的 VTK 小部件或其他 OpenGL 元素在 C++ 中创建。这最适合主要专注于渲染或可视化且用户界面非常少的应用程序。在这个例子中,所有的关键代码都在 jni/main.cxx 中,它看起来很像你习惯的常规 VTK 代码。

它不使用 Android Studio,而且永远!将大量 3rd 方原生代码加载到 Android Studio 中既无用又令人沮丧。最好使用它们的本地构建工具编译这些库,并且只导入需要大量更改和/或交互式调试的小模块。

于 2019-05-16T19:02:28.860 回答