Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
有效地从C+传输大量字节数据+;到爪哇 我有一个java程序,它是用自定义文件格式显示图像的,通过C++库来读取。数据在C++侧加载到char数组中,并在java端传输到缓冲区。因为图像的部分可以从内存中删除,并且需要定期重新加载,所以我希望这些操作尽可能快 我现在做的是从文件读取数据到C++库内存中的缓冲区。为了填充BuffereImage,Java代码对每个像素进行JNI函数调用,以便从该缓冲区读取数据,并在必要时将另一块数据加载到缓冲区中。这是可行的,但是开销比我想要的要高 我一直在做的是将JavaNebug对象通过JNI调用传递给C++代码,并从该函数调用函数。我一直在尽可能多地研究JNI,但我还没有发现在JVM加载的C++库中修改java对象是否有任何成本。这是一种很好的实现方法,还是有一种更快的方法可以使用JNI传输大量字节数据?_Java_Image_Java Native Interface - Fatal编程技术网

有效地从C+传输大量字节数据+;到爪哇 我有一个java程序,它是用自定义文件格式显示图像的,通过C++库来读取。数据在C++侧加载到char数组中,并在java端传输到缓冲区。因为图像的部分可以从内存中删除,并且需要定期重新加载,所以我希望这些操作尽可能快 我现在做的是从文件读取数据到C++库内存中的缓冲区。为了填充BuffereImage,Java代码对每个像素进行JNI函数调用,以便从该缓冲区读取数据,并在必要时将另一块数据加载到缓冲区中。这是可行的,但是开销比我想要的要高 我一直在做的是将JavaNebug对象通过JNI调用传递给C++代码,并从该函数调用函数。我一直在尽可能多地研究JNI,但我还没有发现在JVM加载的C++库中修改java对象是否有任何成本。这是一种很好的实现方法,还是有一种更快的方法可以使用JNI传输大量字节数据?

有效地从C+传输大量字节数据+;到爪哇 我有一个java程序,它是用自定义文件格式显示图像的,通过C++库来读取。数据在C++侧加载到char数组中,并在java端传输到缓冲区。因为图像的部分可以从内存中删除,并且需要定期重新加载,所以我希望这些操作尽可能快 我现在做的是从文件读取数据到C++库内存中的缓冲区。为了填充BuffereImage,Java代码对每个像素进行JNI函数调用,以便从该缓冲区读取数据,并在必要时将另一块数据加载到缓冲区中。这是可行的,但是开销比我想要的要高 我一直在做的是将JavaNebug对象通过JNI调用传递给C++代码,并从该函数调用函数。我一直在尽可能多地研究JNI,但我还没有发现在JVM加载的C++库中修改java对象是否有任何成本。这是一种很好的实现方法,还是有一种更快的方法可以使用JNI传输大量字节数据?,java,image,java-native-interface,Java,Image,Java Native Interface,跨JNI边界移动数据的最有效的方法可能是通过直接字节缓冲区。您应该一次移动尽可能多的字节,因为跨边界本身效率很低,不是转移。当然不止一个像素,最好是一次兆字节。每个像素的通话听起来很糟糕!这将是数十亿次对更大图像的要求。一次获取块或光栅线(例如较大的图像单位)如何?光栅行可以按顺序读取,并避免附加转换吗?是的,行和块都可以读取到C++侧的缓冲区中。我在C++方面做了一些优化。问题是我不知道把数据传送回java的有效方法,所以我对每个像素单独调用,以读取C++缓冲区中的数据。如果可以,那么它可能只

跨JNI边界移动数据的最有效的方法可能是通过直接
字节缓冲区。
您应该一次移动尽可能多的字节,因为跨边界本身效率很低,不是转移。当然不止一个像素,最好是一次兆字节。

每个像素的通话听起来很糟糕!这将是数十亿次对更大图像的要求。一次获取块或光栅线(例如较大的图像单位)如何?光栅行可以按顺序读取,并避免附加转换吗?是的,行和块都可以读取到C++侧的缓冲区中。我在C++方面做了一些优化。问题是我不知道把数据传送回java的有效方法,所以我对每个像素单独调用,以读取C++缓冲区中的数据。如果可以,那么它可能只是在寻找一种方法(最有效地)将数据加载到Java数组中。有没有办法固定数组和/或包装[C++]内存并避免[primary]拷贝?即使有一个额外的复制操作(C++->Java Array->Raster),它仍然可以大大减少JNI调用的数量。此外(我敢说这听起来“非常聪明”),OpenGL(纹理)可以在这里使用吗?(我一直认为WriteableRaster在不需要转换为目标样本格式时能够执行聪明的blt级操作;但我不是图像专家。)看起来它肯定会有所帮助。谢谢不过,我仍然会面临尽可能高效地填充java数组的问题;我假设C++调用java数组方法最好吗?OpenGL可能是一个选项,尽管我不确定它是否能节省传输时间。除非我能同时访问C++和java的相同OpenGL资源,否则它只会提供显示速度的提高,这不是一个问题。如果我能通过OpenGL单独处理内存,那可能是最有效的。太棒了。这听起来正是我想要的。非常感谢。