在两个本机模块(Android NDK)之间传递数据

在两个本机模块(Android NDK)之间传递数据,android,c,shared-libraries,native,android-ndk,Android,C,Shared Libraries,Native,Android Ndk,以下是我的程序结构: -2个独立的模块libA和libB,每个模块都是单个共享库libA.so和libB.so -创建两个线程thA和thB的java活动,每个线程从一个库调用本机JNI函数(thA从libA.so调用函数,thB从libB.so调用函数) 我想在两个库之间传递本机类型的数据(Java不了解这些类型,包含Java无法处理的指针之类的类型),但我找不到任何方法使它们通信 既然两个库都知道本机类型“typeA”的定义,那么有没有办法将typeA对象从libA传递到libB(最好不必将

以下是我的程序结构: -2个独立的模块libA和libB,每个模块都是单个共享库libA.so和libB.so -创建两个线程thA和thB的java活动,每个线程从一个库调用本机JNI函数(thA从libA.so调用函数,thB从libB.so调用函数)

我想在两个库之间传递本机类型的数据(Java不了解这些类型,包含Java无法处理的指针之类的类型),但我找不到任何方法使它们通信

既然两个库都知道本机类型“typeA”的定义,那么有没有办法将typeA对象从libA传递到libB(最好不必将数据复制到VM内存中)。可能传递内存指针


谢谢

将指向类型a的指针从a传递到B可能是一种选择。但这取决于图书馆中typeA的生命周期。确保一个库中的typeA对象在另一个库中仍在使用时未被删除


传递指针的一种方法是遍历JNI并使用jlong/long来表示指针。

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

然而,这种幼稚的方法也有问题。虽然有时可能会工作,但如果libA和libB位于RAM的不同页面上,触摸libB中的指针可能会使程序崩溃。报告的崩溃原因可能因构建和运行而异,这使得调试非常困难。更糟糕的是,如果分配的内存部分驻留在RAM的一个页面上,部分驻留在另一个页面上,则只有当到达边界时,超出边界的内存才会崩溃,因此可能无法立即检测到问题。我已经成功地杀死了操作系统无数次,并产生了各种各样的错误。如果您的库很小,并且加载到相邻的内存中,那么您很可能会没事。Android上的本机应用程序可以解决普通Java应用程序无法解决的问题

解决方案:

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

  • 您可以在两个应用程序之间使用一个数据流来传输数据

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


  • 您能否详细说明如何在thA/thB线程之间切换?例如,当thA线程处于活动状态时,如何在thB线程上运行一些代码?还有我的问题。