写Switch应用首选肯定是C/C++语言,主要依赖是devkitpro和libnx。
如果要用Rust语言来写,最核心的就是两个问题,一个是和核心的libnx交互,一个编译产出的配置。
Rust FFI
由于现实中很多程序是由不同编程语言写的,必然会涉及到跨语言调用,比如 A 语言写的函数如果想在 B 语言里面调用,这时一般有两种解决方案:一种是将函数做成一个服务,通过进程间通信或网络协议通信;另一种就是直接通过 FFI 调用。前者需要至少两个独立的进程才能实现,而后者直接将其它语言的接口内嵌到本语言中,所以调用效率比前者高。
Rust 本身定位为系统编程语言,不可避免要和现有的 C/C++ 代码交互。
Rust FFI原理和使用文档不少,这里要解决了的主要是简便。因为手写所有绑定是不现实的。
rust-bindgen可以帮助我们生成对应的绑定文件,支持C和部分C++。这里我们先只考虑核心的libnx。
创建build.rs文件
extern crate bindgen;
use std::env;
use std::path::PathBuf;
pub fn main() {
let devkitpro_path = env::var("DEVKITPRO").unwrap();
println!("cargo:rustc-link-lib=static=nx");
println!(
"cargo:rustc-link-search=native={}/libnx/lib",
devkitpro_path
);
// …
