用NDK构建osg库到Android 平台几点经验

2024-05-07 05:38

本文主要是介绍用NDK构建osg库到Android 平台几点经验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自 http://blog.csdn.net/giantchen547792075/article/details/17660511

在pc端osg已经证明了他的实力了,大量的扩展项目、严格的跨平台。在移动端目前还没有一个很好的3D开源框架可以使用,开发者需要从0开始写很费事,构建这样一个平台也非一日之功,将其编译到移动平台则来的简单了。一下是在几日来构建过程中遇到的一些问题,比较频繁的,已解决,分享一下。

首先简单介绍一下我在构建时使用的一些工具:

1、操作系统:Win764位旗舰

2、配置工具:CygWin32位版及其提供的32位的cmake

3、构建工具:Cygwin32位下的make工具(3.8.92)

4、NDK:r9b

5、sdk api:android-19

6、Eclipse:adt-bundle-windows-x86-20131030内置的

7、参考博文:OSG Android版本编译

                          osg for android学习之一:windows下编译(亲测通过)

这里要感谢两位大神的经验分享。


osg用的3.2.0的,因为这是目前较为稳定的一个主干版本,一般情况下不需要改动代码。我直接就编译了在pc上根本没测试,最后编译完成运行例子的时候有一点小瑕疵,后面介绍吧。

第三方库用的是osg官网上介绍的那个,虽然我们可以自己搞定,但是对于我这种新手来说将就着用吧。


构建命令:

cmake .. -DOSG_BUILD_PLATFORM_ANDROID=ON -DDYNAMIC_OPENTHREADS=OFF -DDYNAMIC_OPENSCENEGRAPH=OFF -DOSG_GL_DISPLAYLISTS_AVAILABLE=OFF -DOSG_GL_MATRICES_AVAILABLE=ON -DOSG_GL_VERTEX_FUNCS_AVAILABLE=ON -DOSG_GL_VERTEX_ARRAY_FUNCS_AVAILABLE=ON -DOSG_GL_FIXED_FUNCTION_AVAILABLE=ON -DOSG_CPP_EXCEPTIONS_AVAILABLE=OFF -DOSG_GL1_AVAILABLE=OFF -DOSG_GL2_AVAILABLE=OFF -DOSG_GL3_AVAILABLE=OFF -DOSG_GLES1_AVAILABLE=ON -DOSG_GLES2_AVAILABLE=OFF -DJ=4 -DANDROID_PLATFORM=8 -DANDROID_STL="gnustl_static" -DCMAKE_INSTALL_PREFIX={path to folder you want to put your libs and headers}


为什么我在介绍构建工具的时候要说明系统和工具的字长呢?话说我在构建时用了一个64位的cygwin构建了半天都是

-- The C compiler identification is unknown
-- The CXX compiler identification is GNU 4.8.2
CMake Warning at /usr/share/cmake-2.8.11.2/Modules/Platform/CYGWIN.cmake:15 (message):
  CMake no longer defines WIN32 on Cygwin!


  (1) If you are just trying to build this project, ignore this warning or
  quiet it by setting CMAKE_LEGACY_CYGWIN_WIN32=0 in your environment or in
  the CMake cache.  If later configuration or build errors occur then this
  project may have been written under the assumption that Cygwin is WIN32.
  In that case, set CMAKE_LEGACY_CYGWIN_WIN32=1 instead.


  (2) If you are developing this project, add the line


    set(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required


  at the top of your top-level CMakeLists.txt file or set the minimum
  required version of CMake to 2.8.4 or higher.  Then teach your project to
  build on Cygwin without WIN32.
Call Stack (most recent call first):
  /usr/share/cmake-2.8.11.2/Modules/CMakeSystemSpecificInformation.cmake:36 (include)
  CMakeLists.txt:47 (PROJECT)

-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- broken
CMake Error at /usr/share/cmake-2.8.11.2/Modules/CMakeTestCCompiler.cmake:61 (message):
  The C compiler "/usr/bin/cc" is not able to compile a simple test program.


  It fails with the following output:


   Change Dir: /。。。/build/CMakeFiles/CMakeTmp

  Run Build Command:/。。。/strawberry/c/bin/gmake.exe
  "cmTryCompileExec316328232/fast"


  。。。/strawberry/c/bin/gmake -f
  CMakeFiles/cmTryCompileExec316328232.dir/build.make
  CMakeFiles/cmTryCompileExec316328232.dir/build


  gmake[1]: Entering directory
  `。。。/build/CMakeFiles/CMakeTmp'


  /usr/bin/cmake.exe -E cmake_progress_report
  。。。/build/CMakeFiles/CMakeTmp/CMakeFiles
  1


  gmake[1]: Leaving directory
  `.../CMakeFiles/CMakeTmp'


  process_begin: CreateProcess(NULL, /usr/bin/cmake.exe -E
  cmake_progress_report
 .../build/CMakeFiles/CMakeTmp/CMakeFiles
  1, ...) failed.


  make (e=2): ?????????????????


  gmake[1]: *** [CMakeFiles/cmTryCompileExec316328232.dir/testCCompiler.c.o]
  Error 2


  gmake: *** [cmTryCompileExec316328232/fast] Error 2

  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:47 (PROJECT)


-- Configuring incomplete, errors occurred!

其实从表现上来讲应该是gmake那有问题,我把perl在环境变量里的路径去掉(我的Path环境变量里是有一个strawberry的perl路径)perl的bin目录下有gmake这个东西,删掉build文件夹下的CmakeCache等文件,同时换32位的cygwin就没有问题了。在构建例子的时候我就肯定了,就是perl里的gmake作的怪,把那个路径从path环境变量里面删掉。理论上应该可以考虑在path环境变量中把cygwin的bin目录放在perl目录前来屏蔽掉perl路径的影响,如果遇到这个问题的可以尝试一下。

在构建例子的时候则遇到这样的问题:

ndk-build

Android NDK: WARNING:jni/Android.mk:osgNativeLib: non-system libraries in linker flags:

。。。。。。

。。。。。。

Android NDK:     This is likely to result in incorrectbuilds. Try using LOCAL_STATIC_LIBRARIES

Android NDK:     or LOCAL_SHARED_LIBRARIES instead to listthe library dependencies of the

Android NDK:     current module

。。。

。。。

。。。oolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:D:/android/osg_android/osges2/obj/local/armeabi/libosg.a(Program.o): infunction std::_Vector_base<char, std::allocator<char>>::_Vector_impl::_Vector_impl(std::allocator<char>const&):C:/android/android-ndk-r9b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_vector.h:87:error: undefined reference to 'std::allocator<char>::allocator(std::allocator<char>const&)'

collect2: ldreturned 1 exit status

。。。android-ndk-r9b/build/core/build-binary.mk:577:recipe for target 'obj/local/armeabi/libosgNativeLib.so' failed

make: ***[obj/local/armeabi/libosgNativeLib.so] Error 1

这跟mk文件中的变量设置方式有关,LOCAL_C_FLAGS这个变量同一行出现了两个以上的/就会有问题,如果在分行的时候使用空格错误就更奇怪了:

$ANDROID_NDK/ndk-build

jni/Android.mk:26: *** 遗漏分隔符 。 停止。


OK,先写到这吧,慢慢补充吧。

补充1:

。。。/3.2.0/include/osg/State:1086:67: error: 'glEnableClientState' was not declared in this scope
。。。/3.2.0/include/osg/State:1090:68: error: 'glTexCoordPointer' was not declared in this scope
。。。/3.2.0/include/osg/State: In member function 'void osg::State::disableTexCoordPointer(unsigned int)':
。。。/3.2.0/include/osg/State:1124:46: error: 'GL_TEXTURE_COORD_ARRAY' was not declared in this scope
。。。/3.2.0/include/osg/State:1124:68: error: 'glDisableClientState' was not declared in this scope
。。。/3.2.0/include/osg/State: In member function 'void osg::State::disableTexCoordPointersAboveAndIncluding(unsigned int)':
。。。/3.2.0/include/osg/State:1172:50: error: 'GL_TEXTURE_COORD_ARRAY' was not declared in this scope
。。。/3.2.0/include/osg/State:1172:72: error: 'glDisableClientState' was not declared in this scope
。。。/android/android-ndk-r9b/build/core/build-binary.mk:386: recipe for target 'obj/local/armeabi/objs-debug/osgUtil/UpdateVisitor.o' failed
make[3]: *** [obj/local/armeabi/objs-debug/osgUtil/UpdateVisitor.o] Error 1
make[3]: *** 正在等待未完成的任务....
。。。/android/android-ndk-r9b/build/core/build-binary.mk:386: recipe for target 'obj/local/armeabi/objs-debug/osgUtil/TriStripVisitor.o' failed
make[3]: *** [obj/local/armeabi/objs-debug/osgUtil/TriStripVisitor.o] Error 1
CMakeFiles/ndk.dir/build.make:55: recipe for target 'Android-OpenSceneGraph' failed
make[2]: *** [Android-OpenSceneGraph] Error 2
CMakeFiles/Makefile2:63: recipe for target 'CMakeFiles/ndk.dir/all' failed
make[1]: *** [CMakeFiles/ndk.dir/all] Error 2
Makefile:116: recipe for target 'all' failed
make: *** [all] Error 2

这样的错误话说可以忽略,我试着 重新make了一遍,通过。

这篇关于用NDK构建osg库到Android 平台几点经验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966471

相关文章

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短