使用NDK r17c将VTK添加到Android Studio 3.3项目

时间:2019-05-16 17:17:34

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

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

编辑:我已经用一些在官方示例(https://github.com/Kitware/VTK/tree/master/Examples/Android)中发现的相关行更新了CMakeLists.txt文件。我想在我的本机库中使用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} )

2 个答案:

答案 0 :(得分:0)

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

  

NativeVTK围绕   Android本机接口,没有任何与其关联的Java代码。   任何unser接口元素都需要使用常规C语言创建   VTK小部件或其他OpenGL元素。这是最适合的应用程序   主要专注于渲染或可视化,用户最少   接口。在此示例中,所有键代码都位于jni / main.cxx中,它将   看起来非常像您习惯的常规VTK代码。

它不使用Android Studio,而且是很好!将大量的第三方第三方代码加载到Android Studio中既无用又令人沮丧。最好将此类库与其本机构建工具一起编译,并且仅导入需要大量更改和/或交互式调试的小模块。

答案 1 :(得分:0)

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

步骤1:在Linux计算机上构建VTK

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

在那之后,您需要安装下载和构建Android VTK所需的所有东西。这是您需要下载并安装到Linux机器上的东西的列表:

  1. 下载并安装Android NDK-我下载的版本与我在Android Studio中使用的版本相同-r17c
  2. 下载并安装Android SDK(即Android Studio)
  3. 下载并安装ANT
  4. 下载并安装Java
  5. 下载并安装CMake-同样,在安装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,您将需要为每个体系结构构建。另外,您可以在下一步中对其进行编辑!
  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();

}

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
)

就是这样,瞧!