rust_sdl2是一个非常好用的库,只需要依赖它一个库,并且使用ttf
,image
等feature,就可以方便地使用到这些功能,在桌面平台可以非常方便地编译运行。
同时,在没使用这些feature的情况下,参考这个博客和SDL仓库中的这个说明,我们也很容易地可以跑通安卓流程。
但是使用这些feature的情况下,在安卓上就很容易出现运行时加载不到SDL_image
库中的函数之类的问题,或者要不然rust编译链接的时候就已经失败了。
因此我做了这个模板。希望能帮助到所有人。
本章节不含任何操作步骤,讲述的是思路。
gamelib
是一个库项目,desktop
是简单的入口,用于桌面端直接编译运行。拆分是因为安卓工程需要把整个rust程序编译成libmain.so
作为入口。
SDL
和SDL_image
是sdl和其他插件库的源码。用于给安卓studio编译对应的so,同时我们rust编译libmain.so
的时候也需要这些so。
android-project
是SDL
的一部分。由于我使用了git submodule,并且工程我们需要本地修改,我直接把android_project
复制出来了。
assets
是资源路径,存放我们的资源。
android-project
中有几个符号链接:
app/jni/SDL -> SDL
app/jni/SDL_image -> SDL_image
app/src/main/assets/assets -> assets
这些符号链接都是为了避免复制重复资源。
如果还要使用别的feature,例如
ttf
,那需要新增submodule,并且也增加对应的符号链接。
在android-project/build.gradle
中,注释了所有的ndkBuild,换成了cmake配置。如果你会配ndkbuild,那么可以改回去用那个配置。
在android-project/app/jni/CMakeLists.txt
中,注释了最后的add_subdirectory(src)
,因为我们不需要c++的入口代码。
本章节包含操作步骤。当前版本全是在windows下测试。
本例子安卓只包含arm64-v8a目标,其他目标请如法炮制
- 请自行安装各种工具:
如果你只跑桌面端,那么以下工具不需要配置,直接跳转到git工程操作
- 给rust增加编译目标
rustup target add aarch64-linux-android
- 拉取项目
git clone XXX
cd XXX
如果你只跑桌面端,那么这里可以直接cargo run
运行了,后面都不用看。
- 初始化子模块
git submodule update --init --recursive
假设你的安卓studio已经配置好了各种sdk,ndk,cmake之类的。
打开安卓studio,打开工程android-project
,直接点右上角的锤子图标(构建),这里期待会直接构建成功。