【问题标题】:Adding VTK to Android Studio 3.3 project with NDK r17c使用 NDK r17c 将 VTK 添加到 Android Studio 3.3 项目
【发布时间】:2019-05-28 23:38:55
【问题描述】:

我正在尝试将 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} )

【问题讨论】:

    标签: android android-studio cmake android-ndk vtk


    【解决方案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/binJAVA_HOME/binANDROID_SDK/platform-toolsANDROID_SDK/toolsCMAKE_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
    

    如果您按 t(切换)并滚动到配置的 VTK_MODULE_ENABLE_VTK_... 部分,您可以找出所有可能的 name-of-the-module 值。

    1. c(配置)
    2. g(生成)
    3. make

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

    第 2 步:将 VTK 导入 Android Studio

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

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

    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();
    
    }
    

    vtk 模块的build.gradle 文件中,添加以下行:

    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
    )
    

    就是这样,瞧!

    【讨论】:

    【解决方案2】:

    你可以 从官方例子开始on GitHub

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

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

    【讨论】:

    • 好的,你是说VTK已经包含在NDK中了?如果是这样,我该如何使用它,即如何在我的 c/c++ 代码中包含一些 VTK 标头?我尝试使用我在官方示例中发现可用的一些行来更新我的 CMakeLists.txt 文件。请使用 CMakeLists 内容检查我更新的问题
    • 不,我不是这么说的。您必须单独下载和构建 VTK。该示例(我添加了正确的链接)显示了如何将 VTK 与 NDK 一起使用。
    • 好的,我意识到了。我已经安装了 Cmake,下载了 VTK 源并将尝试使用 Visual Studio 2017 构建它。由于我在 Windows 上,我可以将库导入到 Android Studio 吗?我到处看,总是说“在 Linux 或 OSX 上执行此操作。Windows 上的过程很复杂”
    • 不,您必须使用 Android NDK 构建。嗯,Visual Studio 提供了与 NDK 的集成,但据我了解,这很难申请 VTK。如果您无法从 Windows 命令行运行 VTK 的跨平台构建脚本,请考虑使用 WSL 命令行。为此,您需要一个 Linux-64 版本的 NDK。
    • 我将尝试在 Linux 上构建 VTK,您如何描述以及在官方示例中如何描述。建好后,我该怎么办?我是否应该将构建的 .so 文件复制到我的 Android Studio 项目并按照您在this answer 中的描述使用它们?如果是这样,我需要复制所有构建的文件还是只复制我需要的一部分?如何确定我需要复制/导入哪些 .so 文件?根据我正在使用的头文件还是?打扰了,我是原生android的新手
    猜你喜欢
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2017-02-02
    • 2017-01-17
    • 2016-08-07
    • 2016-05-08
    • 1970-01-01
    相关资源
    最近更新 更多