如何避免在Java和本机C++;代码 我写的是C++库,它将被不同的Android应用程序用来处理某种类型的数据,比如二维存储,其中每个维度没有预先定义的大小限制(如浮点数组,数组大小可以相当大)。 当前解决方案使用SWIG将数据从java代码分配的内存复制到C++结构。事实证明,每个浮点值数组(在Java中)都变成了浮点向量(在C++中)
问题在于,大量数据的重复增加了应用程序可用内存不足的风险。我理解,在任何情况下,内存消耗问题都应该通过输入容量限制来解决,但库不知道有多少内存可用,应该拥有完整的数据(需要重复访问任何数据元素)来执行正确的处理如何避免在Java和本机C++;代码 我写的是C++库,它将被不同的Android应用程序用来处理某种类型的数据,比如二维存储,其中每个维度没有预先定义的大小限制(如浮点数组,数组大小可以相当大)。 当前解决方案使用SWIG将数据从java代码分配的内存复制到C++结构。事实证明,每个浮点值数组(在Java中)都变成了浮点向量(在C++中),java,android,c++,java-native-interface,swig,Java,Android,C++,Java Native Interface,Swig,问题在于,大量数据的重复增加了应用程序可用内存不足的风险。我理解,在任何情况下,内存消耗问题都应该通过输入容量限制来解决,但库不知道有多少内存可用,应该拥有完整的数据(需要重复访问任何数据元素)来执行正确的处理 C++ C++代码需要使用java和C++的一个数据存储,所以C++代码需要直接访问java代码存储的数据到Java端分配的内存(由C++代码分配的内存不考虑单个存储)。 我想知道如何以安全的方式组织这样的内存共享(最好使用SWIG) 我觉得这样的实现可能会有一些困难,例如使用Java
- 必须是静态的,不同步的李>
- 参数类型必须是基元或基元数组李>
- 实现不能调用JNI函数,即不能分配Java对象或抛出异常李>
- 不应长时间运行,因为它将在运行时阻止GC
- 它以
开头,而不是JavaCritical\uuu
李>Java\uu
- 它没有额外的
和JNIEnv*
参数李>jclass
- Java数组通过两个参数传递:第一个是数组长度,第二个是指向原始数组数据的指针。也就是说,无需调用
和friends,您可以立即使用直接数组指针GetArrayElements
Sug的说法是:“对Android的支持与java相同,java本地接口(JNI)用于从Android java调用C++或C++编译代码。JNI可以直接访问Java分配的内存,可以在Java环境中分配新内存,并增加/减少对Java对象的引用以控制其垃圾收集。那么,您遇到的实际问题是什么?一般来说,你知道怎么做吗?你看过Android的吗?看看那些:和Sigg的包装部分:“V - Mead我是否正确地理解ByteBuffer可以转换成任何C++类型?“代码>向量>向量> <代码>?@ VolAnd。如果你想避免复制数据,你不能使用C++向量。如果您想直接使用来自Java的数据,则需要使用POD数组,例如
float*floatArray=env->GetDirectBufferAddress(javaFloatBufferObj)代码>或long*longArray=env->getlongarayelements(javafloatararyobj)代码>。在Java代码中使用Java数组还是直接缓冲区取决于您在Java中需要做什么处理。有关信息,请参见“谢谢”。这一次没有帮助(因为限制),但在将来确实会有帮助。