在两个本机模块(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(最好不必将数据复制到VM内存中)。可能传递内存指针在两个本机模块(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(最好不必将
谢谢将指向类型a的指针从a传递到B可能是一种选择。但这取决于图书馆中typeA的生命周期。确保一个库中的typeA对象在另一个库中仍在使用时未被删除
传递指针的一种方法是遍历JNI并使用jlong/long来表示指针。我在正在开发的应用程序中正是这样做的。我在libA中分配内存,并通过JNI将指针作为
long
返回给Java。然后我调用libB中的一个函数,该函数向下传递指针,以便可以访问它
然而,这种幼稚的方法也有问题。虽然有时可能会工作,但如果libA和libB位于RAM的不同页面上,触摸libB中的指针可能会使程序崩溃。报告的崩溃原因可能因构建和运行而异,这使得调试非常困难。更糟糕的是,如果分配的内存部分驻留在RAM的一个页面上,部分驻留在另一个页面上,则只有当到达边界时,超出边界的内存才会崩溃,因此可能无法立即检测到问题。我已经成功地杀死了操作系统无数次,并产生了各种各样的错误。如果您的库很小,并且加载到相邻的内存中,那么您很可能会没事。Android上的本机应用程序可以解决普通Java应用程序无法解决的问题
解决方案:
您能否详细说明如何在thA/thB线程之间切换?例如,当thA线程处于活动状态时,如何在thB线程上运行一些代码?还有我的问题。