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

Rust 怎么方便的与 Android 交互

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

    目前用 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 或者请求的接口隔离,咱能直接被调用内部接口呢
    janus77
        13
    janus77  
       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   ·   实用小工具   ·   3275 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:56 · PVG 19:56 · LAX 03:56 · JFK 06:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.