最近需要用到3D预览方面的功能, 纠结了很久. 最终还是选用了 OSG 来作为3D 渲染的框架.
对于一个没有实际 NDK 开发经验的程序员来讲, 经历了太多太多的坑.
现在记录一下将 OSG 移植到 Android 上面的问题.
开发环境如下
系统:
M1 芯片 macOS 13.1
NDK版本:21.1.6352462
编译方式:CMake
OSG版本:3.6.5
先来一张程序运行图.
480.gif
之前一直想编译为动态库, 但是尝试了很多次都不成功, 无奈之下还是只有选择静态库的方式.
编译脚本如下
BASE_PATH=/Users/yaqi/Documents/OpenSceneGraphSource365
mkdir -p build && cd build
cmake .. \
-DOSG_BUILD_PLATFORM_ANDROID=ON \
-DDYNAMIC_OPENTHREADS=OFF \
-DDYNAMIC_OPENSCENEGRAPH=OFF \
-DOSG_GL1_AVAILABLE=OFF \
-DOSG_GL2_AVAILABLE=OFF \
-DOSG_GL3_AVAILABLE=OFF \
-DOSG_GLES1_AVAILABLE=OFF \
-DOSG_GLES2_AVAILABLE=ON \
-DOPENGL_PROFILE="GLES2" \
-DOSG_GL_LIBRARY_STATIC=OFF \
-DOSG_GL_DISPLAYLISTS_AVAILABLE=OFF \
-DOSG_GL_MATRICES_AVAILABLE=OFF \
-DOSG_GL_VERTEX_FUNCS_AVAILABLE=OFF \
-DOSG_GL_VERTEX_ARRAY_FUNCS_AVAILABLE=OFF \
-DOSG_GL_FIXED_FUNCTION_AVAILABLE=OFF \
-DANDROID_ABI="armeabi-v7a" \
-DANDROID_PLATFORM=android-21 \
-DANDROID_NDK=/Users/yaqi/Library/Android/sdk/ndk/21.1.6352462 \
-DCMAKE_TOOLCHAIN_FILE=/Users/yaqi/Library/Android/sdk/ndk/21.1.6352462/build/cmake/android.toolchain.cmake \
-DJ=8 \
-DCMAKE_INSTALL_PREFIX="./armeabi-v7a"
make
make install
将 BASE_PATH
改为OSG 源码路径. 剩下的就不再过多解释了.
下面是编译完成后的产物.
编译完成
接下来就是把官网提供的 Demo 跑起来. (官网的 Demo 太旧了, 我就新建了一个项目, 然后把部分代码 copy 到自己项目了).
1: 新建 NDK 项目.
- 在
cpp
文件夹下新建一个osg
文件夹, 用来存放osg
的静态库文件和头文件. (如下图所示)
image.png
Ps: 因为用到的插件和功能不多, 所以只使用了这几个库
2: 修改 CMake 文件.
cmake_minimum_required(VERSION 3.18.1)
project("examplendk")
file(GLOB allSource *.c *.cpp)
set(OSG ${CMAKE_SOURCE_DIR}/osg)
include_directories(${OSG}/include)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${OSG}/lib/${CMAKE_ANDROID_ARCH_ABI}")
add_library(
examplendk
SHARED
${allSource})
target_link_libraries( # Specifies the target library.
examplendk
GLESv2
-Wl,--start-group
osg
osgDB
osgText
osgGA
osgViewer
osgUtil
OpenThreads
osgdb_stl
-Wl,--end-group
log)
3: 修改 app 下的 build.gradle
文件
android {
compileSdk 33
ndkVersion "21.1.6352462"
defaultConfig {
applicationId "cn.ac.examplendk"
minSdk 21
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ''
// arguments "-DANDROID_STL=c++_static"
}
}
ndk {
abiFilters "armeabi-v7a"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
externalNativeBuild {
cmake {
path file('src/main/cpp/CMakeLists.txt')
version '3.18.1'
}
}
...
4: 修改读取文件的路径.
将demo 中读取文件的路径改为自己的文件. 就大功告成了.