2014-09-19 282 views
-1

我需要转换一个void *,它将有一个位图数据。 void *是从cpp函数返回的,我需要做的是将这个void *转换为Jni,并将其显示为Java中的位图。将void *转换为字节数组

Void * buffer = CppClass->getbuffer(); 
ByteArray byte[]; 

byte = void *的内容;

+2

你应该学习c/C++基础知识... reinterpret_cast应该有帮助 – Selvin 2014-09-19 13:50:18

+0

你知道这个缓冲区有多大吗?更重要的是,它包含多少有效数据? – Deduplicator 2014-09-19 13:53:42

+0

我试图将void *投射到jbytearray。但在Android端,我需要Byte []。 – iGo 2014-09-19 13:55:38

回答

1

由于java没有void*而jni没有ByteArray,所以你不清楚你的执行环境是什么。

由于问题的根源是void *像素映射,因此我会假设您想要创建一个带有像素的Java Bitmap对象,并结合使用JNI和Java代码。

首先看Bitmap类,有一个方便的函数名为copyPixelsFromBuffer,看起来很有用,它需要一个Buffer

其次,看看JNI函数NewDirectByteBuffer,它需要一个C指针并创建一个ByteBuffer,这也是Bitmap所需的缓冲区。

现在它变得清晰,你只需要:

  • 用JNI代码
  • 通/像素缓冲区创建ByteBuffer返回ByteBuffer到Java土地
  • 填写一个Bitmap这样的ByteBuffer
  • ImageView或您的油漆程序显示。

P.S.留给OP的处理对象引用是GC友好的。

+0

感谢您的快速回复。 void *是从JPEG数据的cpp图层返回的,我通过Jni需要Java图层中的图像数据。 – iGo 2014-09-19 14:09:57

+1

Java不处理void *,你得到的最接近的是一个长整数来存放指针地址,但严格来说它是UD。我上面提出的建议是将ByteBuffer传递给java,并在java端创建Bitmap,这比用JNI创建一个调用大量Java对象方法的Bitmap不那么麻烦。 – 2014-09-19 14:13:08

+0

如果我从Jni返回ByteBuffer到java端,我可以使用哪种类型的返回类型作为JNI函数。 – iGo 2014-09-19 14:28:07