最近对OSG进行了android下的编译。简单总结一下:
0.介绍下环境:WIN7 64位 + cygwin32位 + OSG3.2.0
1.首先介绍几篇博文,参考了不少,但并没有解决我出现的问题,但是仍有借鉴意义。
http://blog.csdn.net/wonegequ1/article/details/46501397
http://blog.csdn.net/xuhaiyan8825/article/details/7847313
2.OSG版本很重要,上面几篇博文之所以没解决我的问题,最后原因竟然是因为我一开始使用的是OSG3.4版本,导致一直出现下面的错误:
‘pthread_setconcurrency’在此作用域中尚未声明 ‘pthread_getconcurrency’ 在此作用域中尚未声明 pthread_yield’在此作用域中尚未声明
上面只出现在了OSG3.4版本中,解决方法还在研究中。换成OSG3.2后,问题就消失。
这里推荐OSG英文的官网http://www.openscenegraph.org/index.php/documentation/platform-specifics/android。对osg各版本的编译介绍的比较清楚,其他博文也都是参考官网的。但是笔者按照官网对OSG3.4进行编译还是有问题,这个后续再研究。
3.cygwin安装很麻烦。装过64位的,报下面的错误: CMake no longer defines WIN32 on Cygwin! 。有博文说换成32位就没问题了,结果我换了32位,还是有这个问题。然后我只能忽略了,最后编译也成功了,所以私人博文不是特别可靠。对于cygwin的安装推荐博文:http://blog.chinaunix.net/uid-7547035-id-60230.html。勾选devel,全装吧。然后在实际使用cygwin中还是会报缺少某些包,回过头重新再search再装就行了。最后到gta这个包,还是报找不到,这个可以忽略,不影响编译。
4.后续还会遇到gdal_priv.h: No such file or directory 的错误,这边是在运行cygwin的cmake时,增加对它的路径的定义:
-DGDAL_DIR=/cygdrive/d/OpenSceneGraph-3.2.0/3rdparty/gdal。然后再进行make时就不会有问题了。
5.一直对cygwin不太理解。现在有了一些体会。cygwin为windows提供了类UNIX的环境。用来搭建c++开发环境GCC。因为安卓操作系统是基于linux的开源系统,而linux是用c语言开发的。安卓本身是用java开发的,并使用JNI调用本地的c语言库,实现操作系统底层调度。但底层驱动及操作系统内核是使用c语言及汇编开发的。。安卓应用可以使用java开发,也可以使用c++native开发
6. .a文件是linux下的静态链接库文件 .so是linux下的动态链接库文件
OpenGL ES 1.0 :
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="armeabi armeabi-v7a" -DANDROID_PLATFORM=8 -DANDROID_STL="gnustl_static" -DANDROID_NDK=/cygdrive/d/01Lib/04android-ndk-r9d -DJ=4 -DCMAKE_INSTALL_PREFIX=/cygdrive/d/OpenSceneGraph-3.2.0/bin -DGDAL_DIR=/cygdrive/d/OpenSceneGraph-3.2.0/3rdparty/gdal/include
OpenGL ES 2.0:
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="armeabi armeabi-v7a" -DANDROID_PLATFORM=8 -DANDROID_STL="gnustl_static" -DANDROID_NDK=/cygdrive/d/01Lib/04android-ndk-r9d -DCMAKE_INSTALL_PREFIX=/cygdrive/d/02OSG/OpenSceneGraph-3.2.0/bin_2 -DGDAL_DIR=/cygdrive/d/OpenSceneGraph-3.2.0/3rdparty/gdal/include