2023最新 OSG for Android 编译运行 Mac 环境

最近需要用到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 中读取文件的路径改为自己的文件. 就大功告成了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容