目前用 Rust 基于 dlna 协议写了个投屏的服务,打包成可执行的二进制文件运行在电视盒子上面的。
如何方便的调用 Android 的方法的操作播放器功能,还是只能在网络层来调用。
1
xuhaoyangx 2023-04-17 10:38:02 +08:00
搜 rust jni
|
2
opentrade 2023-04-17 11:10:34 +08:00
搜 C 怎么方便的与 Android 交互
|
3
yolee599 2023-04-17 11:11:31 +08:00
Rust 其实就是翻译成 C 来编译的,C 怎么交互 Rust 就怎么交互
|
4
horou OP @xuhaoyangx 这种方式只能在打包成 so 库使用,我打包成 2 进制文件在在单独的进程运行可以互调吗
|
6
xylxAdai 2023-04-17 11:34:32 +08:00
你都编译成应用程序运行了,都不在一个进程了,还想互调,你觉得可能吗,了解一下 rpc ,或者自己写个 socket 去请求接口。而且 so 就是二进制文件。
|
7
horou OP @xylxAdai 原方案就是打算用 TCP 的方式去交互,但是比较麻烦( ̄ェ ̄;),就想问问 v 站上面有没有大佬有啥骚操作能做到用 FFI 的方式互调,没办法还是就用 TCP 吧..
|
8
gaifanking 2023-04-17 11:56:11 +08:00 1
推荐 android 端使用 exec 打开你的二进制,然后通过字节流交互,需要把播放的指令稍微封装成简单的协议。
|
9
DianQK 2023-04-17 12:32:28 +08:00 via Android
还是编成 so ,然后参见 https://github.com/mozilla/uniffi-rs
|
10
WispZhan 2023-04-17 12:36:54 +08:00 via Android
ABI 走 JNI/JNA ,或者再重一点 NDK
|
11
duke807 2023-04-17 12:46:55 +08:00 via Android
既然选择了 rust ,就不要怕麻烦
|
12
xylxAdai 2023-04-17 13:24:20 +08:00
@horou 这是不现实的,要不然你直接调用这个二进制包的接口,要不然就 rpc 通信调用,没有这个二进制包都跑起来了你去调的道理,就算你调了,也和对面跑起来的进程没有任何关系。能理解嘛?而且你要调用一个正在跑的应用的接口没有任何意义。如果要通过接口去拿什么内存数据,放本地文件共享就好。如果要通过接口跑逻辑,也是直接引用二进制包即可。数据都放你这边,你自己塞就好,完全没有任何意义去把另外的二进制包跑起来再去调接口的。除非是不同的服务。那不同的服务本身就最好用 rpc 或者请求的接口隔离,咱能直接被调用内部接口呢
|
13
janus77 2023-04-17 13:43:13 +08:00
你想做成什么二进制文件? so 在 linux 系统上就是二进制文件,你要运行起码得有个 runtime 吧,就算是 rpc 也需要你那个二进制文件能自己跑起来。更不用说 android 是有自己的虚拟机,你要跑起来始终也是需要以一个 android 应用的方式存在
|
14
horou OP @janus77 我是打包成 armv7-linux-androideabi 这个架构的 Linux 可执行文件,直接用命令运行的,不需要 runtime
|
15
horou OP @xylxAdai 感谢解答,我这边就是一个单独的应用程序,里面会有一个 webserver 一直处于运行状态,打算还是就用 tcp 来交互了,数据不多,也不算很麻烦。
|
16
horou OP @gaifanking 不是很懂...,意思使用 stdout 和 stdin 这种方式吗
|
18
lysS 2023-04-17 16:31:01 +08:00
打包成动态库啊,然后在 java 里面通过调用。好像要在 Gradle 里面配置些东西才能打包进去。普通的 apk 解压你就会发现里面一堆 so
|
19
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..) 封装个简单协议,使用有限自动机来写比较好。 |
20
gaifanking 2023-04-17 17:06:11 +08:00
如果是 Webserver 一直运行那还是 tcp 或者管道吧
|
21
yolee599 2023-04-17 17:26:59 +08:00
@wusheng0 #17 可能是我的刻板印象,安装 rust 开发环境的时候依赖 gcc ,所以导致了我一直以为 rust 是翻译成 c 的😅
|
23
tyzandhr 2023-04-18 00:52:33 +08:00
如果只是你的个人项目的话,可以试试 tauri-mobile ,在 Android 和 iOS 上用 rust 写 app 。当然,这是个还在开发中的项目,稳定性很差
|
24
clearT 2023-05-24 12:25:56 +08:00
@tyzandhr 现在 tauri 与 IOS 和 Android 的交互基本没有啥可用的 plugin 吧,得自己写 swift 或者 Java ?
|