Ogre 1.10 Android平台编译笔记

来源:互联网 发布:python 短文本相似度 编辑:程序博客网 时间:2024/04/28 05:48

编译平台Windows + CMake +VisualStudio 2015

安装Android SDK 、Android NDK和Mercurial

怎么安装就不介绍了。NDK版本我使用的是r10e。安装完毕之后,需要在系统中添加ANDROID_SDK和ANDROID_NDK两个环境变量,分别指向安装好的SDK和NDK的目录,同时把%ANDROID_SDK%\tools, %ANDROID_SDK%\platform-tools, and %ANDROID_NDK%这三个路径都添加到系统的PATH环境变量。这一步非常重要,执行cmake命令前请务必检查。
使用下面的指令,查看环境变量是否设置好了:
这里写图片描述
这里写图片描述
下载源代码需要使用Mercurial工具,请自行安装。恕不赘述。

下载官方编译好的Android依赖库

http://sourceforge.net/projects/ogre/files/ogre-dependencies-android/1.9/AndroidDependencies.zip/download
从上面的地址下载编译好的Android依赖库。
如果你的NDK的版本是r10b及以下的话,可以直接使用上面编译好的依赖库。但是NDK从r10c开始,移除了很多C库的实现,所以,如果你用高版本的NDK,在链接Ogre库的时候肯定会出现一些未定义的符号。解决的办法是,自己用高版本的NDK编译出Android依赖库。

自己编译Android依赖库(可选)

假如你的NDK版本是r10b及以下,这一步可以跳过。
首先下载ogredeps源代码:
hg clone https://bitbucket.org/cabalistic/ogredeps
下载完毕后,先别编译,官方源代码里面的toolchain脚本有问题,不能正确的交叉编译,请下载我这里提供的脚本覆盖掉cmake/android.toolchain.cmake。
链接:http://pan.baidu.com/s/1eR0jobC 密码:ll84

进入ogredeps目录,执行下面的一系列命令进行编译:
mkdir build & cd build
cmake -DCMAKE_TOOLCHAIN_FILE=”../cmake/android.toolchain.cmake” -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=10 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 -DCMAKE_INSTALL_PREFIX=G:\mydev\Bitbucket\ogredeps\AndroidDependencies ..
之后打开生成的OGREDEPS.sln,进行编译。

注意,我们只需要Release版本的库,不要编译出Debug版本的库,编译出来也要手动删掉。不删,后面编译Ogre时生成的脚本会出错。最后,把编译出来的库,放到目录armeabi-v7a下面,形式如下

这里写图片描述

获取Ogre1.10源代码

执行下面的命令,将源代码拷到本地:
hg clone https://bitbucket.org/sinbad/ogre

编译前的准备工作

将第二步(或者第三步)获得的Android依赖库解压,分别复制到ogre源码的根目录和build目录下面。做完之后,目录结构如下:

ogre/AndroidDependenciesogre/build/AndroidDependencies

之所以要拷贝两份,因为Ogre提供的cmake交叉编译的脚本处理包含路径的时候有点错误,它搜索的时候用的路径和生成的时候用的路径搞错了,不改了,能解决问题就行。

生成编译工程文件

我们进入ogre/build目录下,打开命令行,执行下面的命令,生成VS2015的工程文件:

cmake -DCMAKE_TOOLCHAIN_FILE=”../CMake/toolchain/android.toolchain.cmake” -DOGRE_DEPENDENCIES_DIR=”./AndroidDependencies” -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=10 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 ..

如果没有错误,cmake会有这样的提示
这里写图片描述

注意,toolchain,用4.9版本,4.8版本链接会出现未定义的符号。原因不明。

编译

打开build目录下生成的Ogre.sln,F7即可编译。
除了SampleBrowserDummy这个工程,其他的都能够正确的编译。jni提示说找不到编译出来的*.a库。打开
build/SampleBrowserNDK/jni/Android.mk文件,发现在生成Android编译脚本的时候没有处理是Debug版本的库还是Release版本的库,
我用的比较临时的解决办法,直接把build/lib/Release(或者Debug)/目录下面的*.a全部复制到build/lib目录下面,再编译,SampleBrowserNDK就能正确链接了。
当然解决办法很丑陋,不过我只需要编译一个Release版本出来,这么做也不会出现意外的情况。彻底的办法,当然是去修改CMake脚本,留给官方去改吧。

ogre/build/SampleBrowserNDK下面是自动生成的Android工程,命令行切换到此目录,我们来生成APK文件。

android list targets

上面的命令用于列出当前AndroidSDK支持的API level,记住序号对应的API level。我的机器上有两个:

这里写图片描述

android update project -t 1 -p .ndk-build allant debug install

最后一条命令,把生成的apk安装到模拟器或者实际硬件上。
本以为到此就算完成了,手机上一运行发现段错误,好蛋疼。

继续折腾吧,定位到源代码发现是RenderSystem在没有初始化GpuProgramManager的情况下,就调用了GpuProgramManager::getSingleton(),将OgreRenderSystem.cpp 163行,做如下的修改:

#if OGRE_PLATFORM != OGRE_PLATFORM_ANDROID        GpuProgramManager::getSingleton().setEnableMicrocodeCache(true);#endif

重新编译,生成APK,安装到手机,总算大功告成!截图留念:

这里写图片描述
这里写图片描述

错误处理

如果在第5步,提示找不到AndroidSDK的android这个可执行程序,就需要修改cmake脚本。具体步骤如下:
打开ogre/CMake/Utils/AndroidMacros.cmake这个文件,对77行做如下修改
这里写图片描述

如果你打开Ogre.sln,发现没有Sample_XXX的工程,说明你的AndroidDependencies放置的位置不对,注意检查。

总结

做以上所有的工作,花了我半天的时间。总的来说,Ogre对Android支持还过得去,有坑,但是并不是太大的坑,多尝试几次就可以找到解决方案。
虽然本人已经不用它了,但是看到它能正确运行到手机上,还是一件挺有趣的事情。
以上,欢迎指正。

下载

我把编译好的SDK和APK放出来,供需要的人下载测试,也省去自己编译的麻烦。

APK文件 链接:http://pan.baidu.com/s/1skb06XB 密码:gb5u
SDK 链接:http://pan.baidu.com/s/1jHrnTD8 密码:5xtr

0 0