Ogre 1.10 Android平台编译笔记
2016-02-05 21:48
746 查看
编译平台Windows + CMake +VisualStudio 2015
使用下面的指令,查看环境变量是否设置好了:
下载源代码需要使用Mercurial工具,请自行安装。恕不赘述。
从上面的地址下载编译好的Android依赖库。
如果你的NDK的版本是r10b及以下的话,可以直接使用上面编译好的依赖库。但是NDK从r10c开始,移除了很多C库的实现,所以,如果你用高版本的NDK,在链接Ogre库的时候肯定会出现一些未定义的符号。解决的办法是,自己用高版本的NDK编译出Android依赖库。
首先下载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下面,形式如下
hg clone https://bitbucket.org/sinbad/ogre
之所以要拷贝两份,因为Ogre提供的cmake交叉编译的脚本处理包含路径的时候有点错误,它搜索的时候用的路径和生成的时候用的路径搞错了,不改了,能解决问题就行。
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版本链接会出现未定义的符号。原因不明。
除了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文件。
上面的命令用于列出当前AndroidSDK支持的API level,记住序号对应的API level。我的机器上有两个:
最后一条命令,把生成的apk安装到模拟器或者实际硬件上。
本以为到此就算完成了,手机上一运行发现段错误,好蛋疼。
继续折腾吧,定位到源代码发现是RenderSystem在没有初始化GpuProgramManager的情况下,就调用了GpuProgramManager::getSingleton(),将OgreRenderSystem.cpp 163行,做如下的修改:
重新编译,生成APK,安装到手机,总算大功告成!截图留念:
打开ogre/CMake/Utils/AndroidMacros.cmake这个文件,对77行做如下修改
如果你打开Ogre.sln,发现没有Sample_XXX的工程,说明你的AndroidDependencies放置的位置不对,注意检查。
虽然本人已经不用它了,但是看到它能正确运行到手机上,还是一件挺有趣的事情。
以上,欢迎指正。
APK文件 链接:http://pan.baidu.com/s/1skb06XB 密码:gb5u
SDK 链接:http://pan.baidu.com/s/1jHrnTD8 密码:5xtr
安装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目录下面。做完之后,目录结构如下:[code]ogre/AndroidDependencies ogre/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文件。
[code]android list targets
上面的命令用于列出当前AndroidSDK支持的API level,记住序号对应的API level。我的机器上有两个:
[code]android update project -t 1 -p . ndk-build all ant debug install
最后一条命令,把生成的apk安装到模拟器或者实际硬件上。
本以为到此就算完成了,手机上一运行发现段错误,好蛋疼。
继续折腾吧,定位到源代码发现是RenderSystem在没有初始化GpuProgramManager的情况下,就调用了GpuProgramManager::getSingleton(),将OgreRenderSystem.cpp 163行,做如下的修改:
[code]#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
相关文章推荐
- Android基础之Fragment2
- android *** AsyncTask 代码
- Android学习笔记(十四)——在执行时加入碎片(附源代码)
- 使用Android-Pdf-Viewer-Library开源框架
- android 加载大图片适配问题解决方案
- Android开发之TextView高级应用
- Android Studio之提高编译的效率
- Android Material Design 详解(使用support v7兼容5.0以下系统(部分功能))
- Android 第九天(晚上)
- Android 框架练成 教你打造高效的图片加载框架 (转)
- Android SurfaceView实战 打造抽奖转盘 (转)
- Android M新的运行时权限开发者需要知道的一切
- Error:Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory Android
- Android Touch 事件传递机制
- 深入理解Android的startservice和bindservice
- android如何让service不被杀死
- android4.0手机访问某些网页提示证书过期或者证书不符的处理办法
- android适配
- Android 内存泄漏总结
- Android开发学习——Day1 Android开发环境配置