Rust 怎么方便的与 Android 交互 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
horou
V2EX    程序员

Rust 怎么方便的与 Android 交互

  •  
  •   horou 2023-04-17 10:24:56 +08:00 3711 次点击
    这是一个创建于 968 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    封装个简单协议,使用有限自动机来写比较好。
    gaifanking
        20
    gaifanking  
       2023-04-17 17:06:11 +08:00
    如果是 Webserver 一直运行那还是 tcp 或者管道吧
    yolee599
        21
    yolee599  
       2023-04-17 17:26:59 +08:00
    @wusheng0 #17 可能是我的刻板印象,安装 rust 开发环境的时候依赖 gcc ,所以导致了我一直以为 rust 是翻译成 c 的
    yolee599
        22
    yolee599  
       2023-04-17 17:29:02 +08:00
    @horou #5 安卓可以使用调命令行的方式调吧,Runtime.getRuntime().exec() 之类的
    tyzandhr
        23
    tyzandhr  
       2023-04-18 00:52:33 +08:00
    如果只是你的个人项目的话,可以试试 tauri-mobile ,在 Android 和 iOS 上用 rust 写 app 。当然,这是个还在开发中的项目,稳定性很差
    clearT
        24
    clearT  
       2023-05-24 12:25:56 +08:00
    @tyzandhr 现在 tauri 与 IOS 和 Android 的交互基本没有啥可用的 plugin 吧,得自己写 swift 或者 Java ?
    tyzandhr
        25
    tyzandhr  
       2023-05-24 12:33:36 +08:00 via Android
    @clearT #24 是的
    clearT
        26
    clearT  
       2023-05-24 12:37:40 +08:00
    @tyzandhr 那这感觉用来写移动端应用很鸡肋啊,除非写很简单的移动端应用,不用怎么和 native 打交道,不如用 uniapp ?各种插件都有
    alphawolf
        27
    alphawolf  
       2023-09-19 06:48:41 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4908 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 03:51 PVG 11:51 LAX 19:51 JFK 22:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86