gpt4 book ai didi

android - 在 2 个 native 模块 (Android NDK) 之间传递数据

转载 作者:太空狗 更新时间:2023-10-29 14:29:58 24 4
gpt4 key购买 nike

这是我的程序结构:- 2 个独立的模块 libA 和 libB,每个模块都是一个共享库 libA.so 和 libB.so- 创建 2 个线程 thA 和 thB 的 Java Activity ,每个线程都从一个库中调用 native JNI 函数(thA 从 libA.so 调用函数,thB 从 libB.so 调用函数)。

我想在两个库之间传递 native 类型的数据(Java 对此一无所知,包含 Java 无法处理的指针等类型),但我找不到任何方法让它们进行通信。

假设两个库都知道 native 类型“typeA”的定义,是否有办法将 typeA 的对象从 libA 传递到 libB(最好不必将数据复制到 VM 内存中)。也许传递一个内存指针??

谢谢

最佳答案

我在我正在处理的应用程序中正是这样做的。我在 libA 中分配内存并通过 JNI 将指针作为 long 返回给 Java。然后我在 libB 中调用一个函数,该函数向下传递指针以便可以访问它。

但是,这种幼稚的方法存在问题。虽然它有时可能会起作用,但如果 libA 和 libB 位于不同的 RAM 页上,则触摸 libB 中的指针可能会使程序崩溃。报告的崩溃原因可能因构建和运行而异,这使得调试变得困难。更糟糕的是,如果分配的内存部分驻留在 RAM 的一页上而部分驻留在另一页上,只有当您到达边界时,您才会崩溃超出边界的任何内容,因此可能无法立即检测到问题。我已经设法多次终止操作系统并产生任意数量的各种错误。如果您的库很小并且加载在相邻的内存中,那么您很可能会没事。 Android 上的 native 应用程序可以摆脱普通 Java 应用程序无法做到的事情。

解决方案:

  1. Ashmem将允许您在应用程序之间创建共享内存空间。如果您是 Android 开发或 Linux 操作系统的新手,这可能需要一个学习曲线。

  2. 你可以使用 Socket在两个应用程序之间传输数据。

  3. 您可以通过 JNI functions 从 libA 发送数据直接到 Java 创建的缓冲区,该缓冲区的大小必须能够容纳来自 libA 的数据。然后您可以再次通过 JNI 将其传递给 libB。此解决方案会更慢,成本可能会使您开始使用 native 代码的原因无效,但这是调试和发现问题是与内存相关还是程序逻辑固有的好方法。

关于android - 在 2 个 native 模块 (Android NDK) 之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7873378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com