Rust 怎么方便的与 Android 交互

2023-04-17 10:24:56 +08:00
 horou

目前用 Rust 基于 dlna 协议写了个投屏的服务,打包成可执行的二进制文件运行在电视盒子上面的。

如何方便的调用 Android 的方法的操作播放器功能,还是只能在网络层来调用。

3039 次点击
所在节点    程序员
27 条回复
xuhaoyangx
2023-04-17 10:38:02 +08:00
搜 rust jni
opentrade
2023-04-17 11:10:34 +08:00
搜 C 怎么方便的与 Android 交互
yolee599
2023-04-17 11:11:31 +08:00
Rust 其实就是翻译成 C 来编译的,C 怎么交互 Rust 就怎么交互
horou
2023-04-17 11:17:45 +08:00
@xuhaoyangx 这种方式只能在打包成 so 库使用,我打包成 2 进制文件在在单独的进程运行可以互调吗
horou
2023-04-17 11:18:46 +08:00
@yolee599 如果我不打包成 so 库,而是直接编译成 2 进制可执行文件可以互调吗
xylxAdai
2023-04-17 11:34:32 +08:00
你都编译成应用程序运行了,都不在一个进程了,还想互调,你觉得可能吗,了解一下 rpc ,或者自己写个 socket 去请求接口。而且 so 就是二进制文件。
horou
2023-04-17 11:48:19 +08:00
@xylxAdai 原方案就是打算用 TCP 的方式去交互,但是比较麻烦( ̄ェ ̄;),就想问问 v 站上面有没有大佬有啥骚操作能做到用 FFI 的方式互调,没办法还是就用 TCP 吧..
gaifanking
2023-04-17 11:56:11 +08:00
推荐 android 端使用 exec 打开你的二进制,然后通过字节流交互,需要把播放的指令稍微封装成简单的协议。
DianQK
2023-04-17 12:32:28 +08:00
还是编成 so ,然后参见 https://github.com/mozilla/uniffi-rs
WispZhan
2023-04-17 12:36:54 +08:00
ABI 走 JNI/JNA ,或者再重一点 NDK
duke807
2023-04-17 12:46:55 +08:00
既然选择了 rust ,就不要怕麻烦
xylxAdai
2023-04-17 13:24:20 +08:00
@horou 这是不现实的,要不然你直接调用这个二进制包的接口,要不然就 rpc 通信调用,没有这个二进制包都跑起来了你去调的道理,就算你调了,也和对面跑起来的进程没有任何关系。能理解嘛?而且你要调用一个正在跑的应用的接口没有任何意义。如果要通过接口去拿什么内存数据,放本地文件共享就好。如果要通过接口跑逻辑,也是直接引用二进制包即可。数据都放你这边,你自己塞就好,完全没有任何意义去把另外的二进制包跑起来再去调接口的。除非是不同的服务。那不同的服务本身就最好用 rpc 或者请求的接口隔离,咱能直接被调用内部接口呢
janus77
2023-04-17 13:43:13 +08:00
你想做成什么二进制文件? so 在 linux 系统上就是二进制文件,你要运行起码得有个 runtime 吧,就算是 rpc 也需要你那个二进制文件能自己跑起来。更不用说 android 是有自己的虚拟机,你要跑起来始终也是需要以一个 android 应用的方式存在
horou
2023-04-17 14:00:09 +08:00
@janus77 我是打包成 armv7-linux-androideabi 这个架构的 Linux 可执行文件,直接用命令运行的,不需要 runtime
horou
2023-04-17 14:16:17 +08:00
@xylxAdai 感谢解答,我这边就是一个单独的应用程序,里面会有一个 webserver 一直处于运行状态,打算还是就用 tcp 来交互了,数据不多,也不算很麻烦。
horou
2023-04-17 14:20:01 +08:00
@gaifanking 不是很懂...,意思使用 stdout 和 stdin 这种方式吗
wusheng0
2023-04-17 15:12:57 +08:00
@yolee599 你好,第一次看到这种说法,请问有什么资料或者文档不,想研究一下
lysS
2023-04-17 16:31:01 +08:00
打包成动态库啊,然后在 java 里面通过调用。好像要在 Gradle 里面配置些东西才能打包进去。普通的 apk 解压你就会发现里面一堆 so
gaifanking
2023-04-17 17:04:26 +08:00
@horou 是的
android 端 Java 代码:
Process pro = Runtime.getRuntime().exec("your bin path", new String[]{});
InputStream in = pro.getInputStream();
InputStream error = pro.getErrorStream();
OutputStream out = pro.getOutputStream();
out.write(...);

rust 不会,参考 c 代码:
read(stdin, buf, BUF_SIZE);
write(stdout..)

封装个简单协议,使用有限自动机来写比较好。
gaifanking
2023-04-17 17:06:11 +08:00
如果是 Webserver 一直运行那还是 tcp 或者管道吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/933069

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX