我正在尝试将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} )
答案 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机器上的东西的列表:
sudo apt-get update && sudo apt-get install build-essential
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源代码:
cd vtk
git clone https://github.com/Kitware/VTK.git
现在,您可以构建VTK:
mkdir vtk/vtk-android
cd vtk-android
ccmake ../VTK
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
如果您按t(切换)并滚动到配置的VTK_MODULE_ENABLE_VTK _...,则可以找出所有可能的name-of-the-module
值。
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
文件夹,然后在该文件夹内复制上述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
)
就是这样,瞧!