引言
最近又在看Rust相关的东西,于是很无聊的写下了这篇文章,作为 Rust NDK 的接入笔记,也包括在过程中踩的坑。
开发环境
操作系统:Windows 11
编码软件:Visual Studio Code 1.93.1 | Android Studio Ladybug | 2024.2.1 Beta 1
环境搭建
当你阅读本文时,默认你已经配置好了相关环境变量;如果没有,请自行搜索阅读相关文章。
正文
Rust社区提供了两个 crates 来支持和简化 NDK 的开发,它们分别为:
本文的案例也是建立在这两个 crates 的基础上。
创建Rust项目
按照 rust lib 的常规创建逻辑,我们首先在工作目录下Rust lib项目,然后再将它进行ndk改造。
上述命令行操作后就已经成功在 vscode 中打开了 example_1 项目。
接下来,我们需要修改这个lib项目的 Cargo.toml
,添加上面提到的两个crates,添加完成后应该是下面这个样子。
上图分别基于 cargo-ndk example 和 jni-rs example 修改。
然后,就是对so编译打包的相关工具链的安装了。
参考 cargo-ndk 的文档,我们需要执行以下命令行来进行目标工具链的安装
rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android
下图是我已经安装成功后的截图。
至此,该lib项目便能够正常编写NDK相关逻辑了。
接下来,我们打开项目中的 lib.rs
源代码文件,编写一段简单的 rust ndk 代码实现。
逻辑编写完成后,通过 cargo-ndk 提供的 docs 文档执行以下命令进行 so 文件的编译和打包。
cargo ndk -t armeabi-v7a -t arm64-v8a -o ./jniLibs build --release
上述命令只打包了 armeabi-v7a
和 arm64-v8a
两个so文件,如果需要其他架构,可以自行增加参数。
编译打包命令完成后,项目目录就会产出jniLibs
文件夹和对应架构的so文件。
创建Android项目
接下来,我们创建android项目Example1
来进行测试。
我们将编译后的产物连同 jniLibs
目录一起放入 app/src/main
目录下,然后编写对应的 JNI 接口类和方法。
这里需要注意的是,如果是静态实现(static)
使用kotlin的伴生对象,包括 object RustJNI { ... }
则需要在方法上增加 @JvmStatic
注解来将 add
方法直接暴露给Java,否则你就需要修改 JNI中的方法签名,以下是崩溃截图。
这时候就需要修改 JNI 方法签名了。
言归正传,接下来修改 MainActivity
,来调用这个JNI方法。
然后,我们需要在 build.gradkle.kts
中增加
如果没有上图的 ndk{ ... }
那么你大概率在 Run 时会崩溃。
得到一个崩溃异常:java.lang.UnsatisfiedLinkError
结果展示
最后,通过点击按钮后,得到 1+2 的值。
至此,开篇结束。
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/archives/22315,转载请注明出处。
评论0