Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.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+;中的Android NDK创建位图吗+;然后快速地将它们传递给Java? 我需要用NDK在C++中创建Bitmaps,并将它们传递给java。我不是说复制,而是把它们作为参数或返回值或其他类似的东西传递,因为复制它们的速度太慢了。我还需要在NDK部分而不是java中创建它们_Java_Android_C++_Bitmap - Fatal编程技术网

我可以用C+;中的Android NDK创建位图吗+;然后快速地将它们传递给Java? 我需要用NDK在C++中创建Bitmaps,并将它们传递给java。我不是说复制,而是把它们作为参数或返回值或其他类似的东西传递,因为复制它们的速度太慢了。我还需要在NDK部分而不是java中创建它们

我可以用C+;中的Android NDK创建位图吗+;然后快速地将它们传递给Java? 我需要用NDK在C++中创建Bitmaps,并将它们传递给java。我不是说复制,而是把它们作为参数或返回值或其他类似的东西传递,因为复制它们的速度太慢了。我还需要在NDK部分而不是java中创建它们,java,android,c++,bitmap,Java,Android,C++,Bitmap,有人知道这样做的方法吗?您可以尝试使用直接ByteBuffer。字节缓冲区是指内存的本机区域。但是,要在Java中使用图像,它必须位于Java对象中。您可以用Java或C组装此对象,但我不知道如何避免复制映像,除非您的C库将映像写入Java结构。正如Peter Lawrey已经指出的那样,使用非Java对象是不可能的,但是可以直接从简单的Java字节数组绘制原始数据(可以在C++侧直接访问)。 最后,你甚至可以调用这个字节数组来绘制你创建的图像。当然,这需要将C++的图像直接存储在字节数组内的所

有人知道这样做的方法吗?

您可以尝试使用直接ByteBuffer。字节缓冲区是指内存的本机区域。但是,要在Java中使用图像,它必须位于Java对象中。您可以用Java或C组装此对象,但我不知道如何避免复制映像,除非您的C库将映像写入Java结构。

正如Peter Lawrey已经指出的那样,使用非Java对象是不可能的,但是可以直接从简单的Java字节数组绘制原始数据(可以在C++侧直接访问)。

最后,你甚至可以调用这个字节数组来绘制你创建的图像。当然,这需要将C++的图像直接存储在字节数组内的所需格式。

爪哇:

然后将>Byth[]/Cord>引用引用到本机C++实现。在C++端,可以调用

C++:


我有同样的问题,我的解决方法是在C++中分配巨大的缓冲区,然后将每个请求的“视图”绘制成一个java位图。Android 2.2中出现的NDK位图功能;它们允许直接访问位图位。它可能不适合您的使用,但它确实可以避免复制位图,并允许您创建与可用内存一样大的位图。我创建了一个显示窗口大小的位图,然后使用我自己的本地浏览器将大位图中的缩放视图绘制到其中代码缩放器.< /p>谢谢你的回复。我理解你的字节数组必须完全在java中创建,然后只能在C++中访问和改变吗?是的,你必须用java创建字节数组。C++侧你可以“锁定”。获取指针的数据。解锁后,你可以在爪哇使用和更改它。看看我的更新答案。谢谢你的回复。我的目标是分配位图,超出java堆内存,这意味着它必须在C++中分配。有没有办法用字节缓冲区来实现这个?你可以改变ByteBuffer的地址字段。再次感谢JNI(或reflection),我会试试这个!BitBank:你从在线示例中获得位图绘制代码了吗?如果是,你能发布一个链接吗?位图绘制代码是我自己的(ARM asm),我不想发布它。

byte[] pixelBuf = new byte[bufSize];
jbyte* pixelBufPtr = env->GetByteArrayElements(pixelBuf, JNI_FALSE);
jsize pixelBufLen = env->GetArrayLength(env, pixelBuf);
// modify the data at pixelBufPtr with C++ functions
env->ReleaseByteArrayElements(pixelBuf, pixelBufPtr, 0);