使用 NDK r17c 将 VTK 添加到 Android Studio 3.3 项目
Adding VTK to Android Studio 3.3 project with NDK r17c
我正在尝试将 VTK 添加到我在 AS 3.3 中的本机 Android 项目。我已经安装了 NDK r17c。我想在我的本机应用程序中使用一些 VTK 功能。此外,我使用 gradle 3.3.2 构建我的 android 项目,使用 CMake 3.6.4 构建项目的本地端。我的问题是我还没有找到合适的教程(我是 Android 本机开发的新手)来使用我描述的所有构建工具将 VTK 导入 Android Studio。有没有办法做到这一点?
另外,我想补充一点,我正在使用 Windows 7 OS.
编辑:我已经更新了我的 CMakeLists.txt 文件,其中包含我在官方示例 (https://github.com/Kitware/VTK/tree/master/Examples/Android) 中发现的一些相关行。我想在我的 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} )
你可以
先从官方例子开始 on GitHub:
NativeVTK is built around the
Android native interface and does not have any Java code associated with it.
Any unser interface elements would need to be created in C++ using regular
VTK widgets or other OpenGL elements. This is best for applications that
are mainly focused on rendering or visualization with very minimal user
interface. In this example all the key code is in jni/main.cxx and it will
look very much like the regular VTK code you are used to.
它不使用 Android Studio,而且永远如此!将大量第 3 方本机代码加载到 Android Studio 既无用又令人沮丧。最好使用它们的本机构建工具编译此类库,并且只导入需要大量更改的小模块 and/or 交互式调试。
好的,我花了大约一周的时间才开始工作,但它得到了回报。我将列出我需要做的所有事情才能在我的 android 应用程序中使用 VTK。
第 1 步:在 Linux 机器上构建 VTK
因为Android是基于LinuxOS,你需要构建.a
或.so
格式的库。为此,最简单的方法是在 Linux 机器上构建 VTK。所以你必须安装 Linux 作为双引导到你的机器上,或者像我的情况一样,安装一个 运行s Linux.
的虚拟机
之后,您需要安装为 Android 下载和构建 VTK 所需的所有东西。以下是您需要下载并安装到 Linux 机器上的东西的列表:
- 下载并安装 Android NDK- 我下载了我在 Android Studio 中使用的相同版本 - r17c
- 下载并安装 Android SDK,即 Android Studio
- 下载并安装 ANT
- 下载并安装Java
- 下载并安装 CMake - 安装后,我还需要 运行:
sudo apt-get update && sudo apt-get install build-essential
- 下载并安装Git
- 安装 OpenGL - 我用过:
sudo apt-get install freeglut3-dev
- 定义
ANDROID_NDK
环境变量 - 将其指向解压缩的 android NDK 文件夹
- 定义
ANT_HOME
环境变量 - 将其指向解压缩的 ANT 文件夹
- 定义
JAVA_HOME
环境变量 - 将其指向解压缩的 Java JRE 文件夹
- 定义
ANDROID_SDK
环境变量 - 将其指向 Android/Sdk 文件夹的位置
- 定义
CMAKE_HOME
环境变量 - 将其指向您安装的 CMake 的位置
- 添加到
PATH
环境变量:ANT_HOME/bin
、JAVA_HOME/bin
、ANDROID_SDK/platform-tools
、ANDROID_SDK/tools
、CMAKE_HOME/bin
以上所有需要的工具安装完成后,需要使用git下载VTK源码:
- 在某处创建一个 'vtk' 文件夹
cd vtk
git clone https://github.com/Kitware/VTK.git
现在,您可以开始构建 VTK:
mkdir vtk/vtk-android
cd vtk-android
ccmake ../VTK
- 按 c(配置)
- 按 c(配置)
- 按 q(退出)
cmake -DVTK_ANDROID_BUILD=ON -DANDROID_NATIVE_API_LEVEL=23 -DANDROID_ARCH_ABI=arm64-v8a ../VTK
- 这里我定义了 23 api 级别,因为这是我在我的应用程序中使用的级别。此外,您还可以在此处定义目标设备的架构 ABI。我的设备是 arm64-v8a,所以我正在使用它。为了为其他架构构建 VTK,您需要为它们中的每一个构建。此外,您可以在下一步中对其进行编辑!
ccmake ../VTK
可选:此时,您可以在应用程序中定义所需的其他模块。如果您跳过这一步,您将获得的模块(.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_... 配置的一部分。
- c(配置)
- g(生成)
make
好的,构建过程开始了。在我的笔记本电脑上花了大约 30 分钟(我为虚拟机分配了 3GB 的内存)。
第 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
文件夹并在该文件夹中复制上述 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
)
就是这样,瞧!
我正在尝试将 VTK 添加到我在 AS 3.3 中的本机 Android 项目。我已经安装了 NDK r17c。我想在我的本机应用程序中使用一些 VTK 功能。此外,我使用 gradle 3.3.2 构建我的 android 项目,使用 CMake 3.6.4 构建项目的本地端。我的问题是我还没有找到合适的教程(我是 Android 本机开发的新手)来使用我描述的所有构建工具将 VTK 导入 Android Studio。有没有办法做到这一点? 另外,我想补充一点,我正在使用 Windows 7 OS.
编辑:我已经更新了我的 CMakeLists.txt 文件,其中包含我在官方示例 (https://github.com/Kitware/VTK/tree/master/Examples/Android) 中发现的一些相关行。我想在我的 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} )
你可以 先从官方例子开始 on GitHub:
NativeVTK is built around the Android native interface and does not have any Java code associated with it. Any unser interface elements would need to be created in C++ using regular VTK widgets or other OpenGL elements. This is best for applications that are mainly focused on rendering or visualization with very minimal user interface. In this example all the key code is in jni/main.cxx and it will look very much like the regular VTK code you are used to.
它不使用 Android Studio,而且永远如此!将大量第 3 方本机代码加载到 Android Studio 既无用又令人沮丧。最好使用它们的本机构建工具编译此类库,并且只导入需要大量更改的小模块 and/or 交互式调试。
好的,我花了大约一周的时间才开始工作,但它得到了回报。我将列出我需要做的所有事情才能在我的 android 应用程序中使用 VTK。
第 1 步:在 Linux 机器上构建 VTK
因为Android是基于LinuxOS,你需要构建.a
或.so
格式的库。为此,最简单的方法是在 Linux 机器上构建 VTK。所以你必须安装 Linux 作为双引导到你的机器上,或者像我的情况一样,安装一个 运行s Linux.
之后,您需要安装为 Android 下载和构建 VTK 所需的所有东西。以下是您需要下载并安装到 Linux 机器上的东西的列表:
- 下载并安装 Android NDK- 我下载了我在 Android Studio 中使用的相同版本 - r17c
- 下载并安装 Android SDK,即 Android Studio
- 下载并安装 ANT
- 下载并安装Java
- 下载并安装 CMake - 安装后,我还需要 运行:
sudo apt-get update && sudo apt-get install build-essential
- 下载并安装Git
- 安装 OpenGL - 我用过:
sudo apt-get install freeglut3-dev
- 定义
ANDROID_NDK
环境变量 - 将其指向解压缩的 android NDK 文件夹 - 定义
ANT_HOME
环境变量 - 将其指向解压缩的 ANT 文件夹 - 定义
JAVA_HOME
环境变量 - 将其指向解压缩的 Java JRE 文件夹 - 定义
ANDROID_SDK
环境变量 - 将其指向 Android/Sdk 文件夹的位置 - 定义
CMAKE_HOME
环境变量 - 将其指向您安装的 CMake 的位置 - 添加到
PATH
环境变量:ANT_HOME/bin
、JAVA_HOME/bin
、ANDROID_SDK/platform-tools
、ANDROID_SDK/tools
、CMAKE_HOME/bin
以上所有需要的工具安装完成后,需要使用git下载VTK源码:
- 在某处创建一个 'vtk' 文件夹
cd vtk
git clone https://github.com/Kitware/VTK.git
现在,您可以开始构建 VTK:
mkdir vtk/vtk-android
cd vtk-android
ccmake ../VTK
- 按 c(配置)
- 按 c(配置)
- 按 q(退出)
cmake -DVTK_ANDROID_BUILD=ON -DANDROID_NATIVE_API_LEVEL=23 -DANDROID_ARCH_ABI=arm64-v8a ../VTK
- 这里我定义了 23 api 级别,因为这是我在我的应用程序中使用的级别。此外,您还可以在此处定义目标设备的架构 ABI。我的设备是 arm64-v8a,所以我正在使用它。为了为其他架构构建 VTK,您需要为它们中的每一个构建。此外,您可以在下一步中对其进行编辑!ccmake ../VTK
可选:此时,您可以在应用程序中定义所需的其他模块。如果您跳过这一步,您将获得的模块(.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_... 配置的一部分。
- c(配置)
- g(生成)
make
好的,构建过程开始了。在我的笔记本电脑上花了大约 30 分钟(我为虚拟机分配了 3GB 的内存)。
第 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
文件夹并在该文件夹中复制上述 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
)
就是这样,瞧!