您的位置:首页 > 移动开发 > Android开发

OpenSceneGraph Android 开发学习 - 编译

2014-07-16 14:26 603 查看
一、编译

1.准备

a)OSG相关库及资源

1)OpenSceneGraph3.2.0:http://www.openscenegraph.org/index.php/download-section/stable-releases
2)3rdPartyDependency:http://www2.ai2.upv.es/difusion/osgAndroid/3rdpartyAndroid.zip
3)DataResouce:http://www.openscenegraph.org/index.php/download-section/data
解压OpenSceneGraph库的压缩包,同时将3rdPartyAndroid.zip解压到OpenSceneGraph的根目录下。

b)安装Cygwin及相关工具

1)下载Cygwin:http://www.cygwin.com/
2)安装相关工具至少包括:cmake,make,gcc-core,gcc-g++

网上有不少人讨论版本问题,个人使用的版本为:cmake2.8.9-2,make4.0-2,gcc-core4.8.3-1,gcc-g++4.8.3-1

c)AndroidNDK开发相关资源

1)NDK:android-ndk-r9dhttps://developer.android.com/tools/sdk/ndk/index.html
2)ADT:adt-bundle-windows-x86_64-20140624http://developer.android.com/sdk/index.html
3)JDK或者JRE

http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html

NDK环境的搭建可以参考http://jingyan.baidu.com/article/5d6edee22d908799eadeec9f.html其中,JRE如果为了方便,可以直接安装在ADT带的Eclipse根目录下。
基本的Android开发环境搭建可以参考
/content/2573656.html

2.编译OpenSceneGraph

本人的OpenSceneGraph目录为E:\Android\OpenSceneGraph-3.2.0,在该目录下新建build文件夹和install文件夹,build文件夹用于存放cmake产生的临时文件,install用于存放编译后得到的include及obj文件。具体编译步骤如下

a)以管理员方式打开Cygwin,进入build目录

cd/cygdrive/e/Android/OpenSceneGraph-3.2.0/build/

其中/cygdrive/是cygwin在windows下模拟的目录。

b)运行cmake

对于OpenGLES1.1

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-DANDROID_ABI="armeabiarmeabi-v7a"-DANDROID_PLATFORM=8-DANDROID_STL="gnustl_static"-DANDROID_NDK=/cygdrive/e/Android/android-ndk-r9d-DCMAKE_INSTALL_PREFIX=/cygdrive/e/Android/OpenSceneGraph-3.2.0/install
-DJ=4

对于OpenGLES2.0

cmake..-DOSG_BUILD_PLATFORM_ANDROID=ON-DDYNAMIC_OPENTHREADS=OFF-DDYNAMIC_OPENSCENEGRAPH=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
-DOSG_CPP_EXCEPTIONS_AVAILABLE=OFF-DOSG_GL1_AVAILABLE=OFF-DOSG_GL2_AVAILABLE=OFF-DOSG_GL3_AVAILABLE=OFF-DOSG_GLES1_AVAILABLE=OFF-DOSG_GLES2_AVAILABLE=ON-DANDROID_ABI="armeabiarmeabi-v7a"-DANDROID_PLATFORM=8-DANDROID_STL="gnustl_static"-DCMAKE_INSTALL_PREFIX=/cygdrive/e/Android/OpenSceneGraph-3.2.0/install_2
-DJ=4

其中,DCMAKE_INSTALL_PREFIX为之前定好的安装目录,DANDROID_NDK为NDK的安装目录,正常cmake过程中,会提示



DANDROID_NDK也可以不使用,替代方案为:

修改cygwin安装目录下/home/Edgar/.bash_profile,在末尾添加如下语句

NDROID_NDK=/cygdrive/E/Android/android-ndk-r9dexportANDROID_NDK

其中,Edgar为个人用户名,/cygdrive/E/Android/android-ndk-r9d为NDK的存放目录,需要根据个人配置修改。

在修改完上述.bash_profile后,需要重启Cygwin上述配置才能生效。

对于GLES1和2的cmake命令区别,可以参考

http://trac.openscenegraph.org/projects/osg//wiki/Community/OpenGL-ES

c)执行make

在执行过程中,会出现错误,认真查看输出信息,可以找到类似下面的提示

E:/Android/OpenSceneGraph-3.2.0/include/OpenThreads/Exports:17:30:fatalerror:E:/Android/OpenSceneGraph-3.2.0/build/include/OpenThreads/Config:Permissiondenied
compilationterminated.
/cygdrive/E/Android/android-ndk-r9d/build/core/build-binary.mk:393:recipefortarget'obj/local/armeabi/objs/osgdb_osc/ReaderWriterOscDevice.o'failed
make[3]:***[obj/local/armeabi/objs/osgdb_osc/ReaderWriterOscDevice.o]Error1
CMakeFiles/ndk.dir/build.make:55:recipefortarget'Android-OpenSceneGraph'failed
make[2]:***[Android-OpenSceneGraph]Error2
CMakeFiles/Makefile2:63:recipefortarget'CMakeFiles/ndk.dir/all'failed
make[1]:***[CMakeFiles/ndk.dir/all]Error2
Makefile:116:recipefortarget'all'failed
make:***[all]Error2
可以看出是Config文件无法访问。查看Config文件的访问权限,竟然连读都不支持,修改/build/include/OpenThreads/Config和/build/include/osg/Config的读写权限,至少支持可读。这个问题不是很确定为什么会发生,可能是Windows下特有的,没有在Linux或者其他系统下测试过。

d)执行makeinstall

执行完成后,在install目录下应该会有includelibobj三个文件夹。

网上有部分人说在install结束后obj文件夹下可能会确实第三方库的*.a文件,如果的确没有,可以从之前下载的3rdParty目录下拷贝过来即可。

整个编译过程可以对比参考:http://blog.csdn.net/xuhaiyan8825/article/details/7847313
3.运行例子

打开Eclipse,新建Android项目,从已有代码创建,倒入OpenSceneGraphExample目录下的osgAndroidExampleGLES1。网上有人说直接运行就能执行,但是在本机上却有链接错误。类似

error:undefinedreferenceto'virtualthunktostd::basic_istringstream<char,std::char_traits<char>,std::allocator<char>>::~basic_istringstream()'

可以大概看出是标准库的链接错误。具体分析其实是libgnustl_static.a没有找到。修改Android.mk





其中STLLIBDIR为NDK下libgnustl_static.a所在的目录。

在LOCAL_LDFLAGS的末尾添加该文件目录

LOCAL_LDFLAGS+=-L$(LIBDIR)\

-losgdb_dds\

-losgdb_openflight\

….

-lOpenThreads\

$(STLLIBDIR)/libgnustl_static.a


在实际运行过程中,本机上出现了在执行System.loadLibrary("osgNativeLib");后没有返回的情况,需要注释掉OsgMainApp.hpp中的

//USE_SERIALIZER_WRAPPER_LIBRARY(osgParticle)

这样之后即可运行成功。具体原因还未弄清楚,可能跟如下链接讨论的问题有关。

https://code.google.com/p/android/issues/detail?id=43819


具体过程也可以参考:

/article/8733122.html

/article/1841062.html


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: