Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免在Java和本机C++;代码 我写的是C++库,它将被不同的Android应用程序用来处理某种类型的数据,比如二维存储,其中每个维度没有预先定义的大小限制(如浮点数组,数组大小可以相当大)。 当前解决方案使用SWIG将数据从java代码分配的内存复制到C++结构。事实证明,每个浮点值数组(在Java中)都变成了浮点向量(在C++中)_Java_Android_C++_Java Native Interface_Swig - Fatal编程技术网

如何避免在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

问题在于,大量数据的重复增加了应用程序可用内存不足的风险。我理解,在任何情况下,内存消耗问题都应该通过输入容量限制来解决,但库不知道有多少内存可用,应该拥有完整的数据(需要重复访问任何数据元素)来执行正确的处理

C++ C++代码需要使用java和C++的一个数据存储,所以C++代码需要直接访问java代码存储的数据到Java端分配的内存(由C++代码分配的内存不考虑单个存储)。 我想知道如何以安全的方式组织这样的内存共享(最好使用SWIG)

我觉得这样的实现可能会有一些困难,例如使用Java垃圾收集器(C++代码可以寻址到已经释放的存储)和通过包装器减慢内存访问速度(如前所述,库需要重复访问每个数据项)……但也许有人建议我一个可靠的解决方案。 如果有足够有力的论据支持,我的想法错误的原因可以接受。

您可以使用关键的本机实现访问原始数据数组。这种技术允许直接访问jvm内存,而无需在Java和本机代码之间传输数据

但这有下一个限制:

  • 必须是静态的,不同步的
  • 参数类型必须是基元或基元数组
  • 实现不能调用JNI函数,即不能分配Java对象或抛出异常
  • 不应长时间运行,因为它将在运行时阻止GC
关键本机的声明看起来像常规JNI方法,除了:

  • 它以
    JavaCritical\uuu
    开头,而不是
    Java\uu
  • 它没有额外的
    JNIEnv*
    jclass
    参数
  • Java数组通过两个参数传递:第一个是数组长度,第二个是指向原始数组数据的指针。也就是说,无需调用
    GetArrayElements
    和friends,您可以立即使用直接数组指针

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中需要做什么处理。有关信息,请参见“谢谢”。这一次没有帮助(因为限制),但在将来确实会有帮助。