我正在编写一个C++库,将用于不同的Android应用程序来处理某种类型的数据,该数据组织方式类似于二维存储,其中每个维度没有预定义的大小限制(例如浮点数组的数组,数组的大小可能相当大)。
目前的解决方案使用SWIG将数据从Java代码分配的内存复制到C++结构中。结果发现每个浮点值数组(在Java中)变成了浮点向量(在C++中)。
问题在于大量数据的复制会增加应用程序可用内存耗尽的风险。我知道,无论如何,内存消耗问题都应该通过输入量限制来解决,但是库不知道有多少可用内存并且需要整个数据(需要重复访问任何数据元素)才能执行正确的处理。
因此,现在我正在考虑使用一个数据存储区域供Java和C++使用,因此C++代码需要直接访问由Java代码存储在Java端分配的内存中的数据(不考虑将由C++代码分配的内存作为单个存储区域)。
我想知道如何以安全的方式组织这样的内存共享(最好使用SWIG)。
我感觉这种实现可能会遇到一些困难,例如Java垃圾回收器(C++代码可以访问已经被释放的存储区域)和通过包装器减慢内存访问(如前所述,库需要重复访问每个数据项)...但也许有人可以为我提供一个可靠的解决方案。如果支持足够和令人信服的论据,我可以接受对我的想法错误的解释。
目前的解决方案使用SWIG将数据从Java代码分配的内存复制到C++结构中。结果发现每个浮点值数组(在Java中)变成了浮点向量(在C++中)。
问题在于大量数据的复制会增加应用程序可用内存耗尽的风险。我知道,无论如何,内存消耗问题都应该通过输入量限制来解决,但是库不知道有多少可用内存并且需要整个数据(需要重复访问任何数据元素)才能执行正确的处理。
因此,现在我正在考虑使用一个数据存储区域供Java和C++使用,因此C++代码需要直接访问由Java代码存储在Java端分配的内存中的数据(不考虑将由C++代码分配的内存作为单个存储区域)。
我想知道如何以安全的方式组织这样的内存共享(最好使用SWIG)。
我感觉这种实现可能会遇到一些困难,例如Java垃圾回收器(C++代码可以访问已经被释放的存储区域)和通过包装器减慢内存访问(如前所述,库需要重复访问每个数据项)...但也许有人可以为我提供一个可靠的解决方案。如果支持足够和令人信服的论据,我可以接受对我的想法错误的解释。
vector<vector<float>>
呢? - VolAndfloat *floatArray = env->GetDirectBufferAddress(javaFloatBufferObj);
或者long *longArray = env->GetLongArrayElements(javaFloatArrayObj);
。在Java代码中使用Java数组或直接缓冲区取决于你需要在Java中进行什么处理。请参见https://dev59.com/mmMk5IYBdhLWcg3w2RaT。 - Andrew Henle