我试图弄清楚如何在ContentProvider.openFile中传递数据流。要发送的数据在JNI中创建。我尝试了createPipe的传输线,但我遇到了大量的麻烦,断裂的管道。所以我想我可以把“写”管道传递给JNI,然后直接把数据写到JNI。
爪哇:
ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
boolean result = ImageProcessor.getThumb(fd/*source fd*/, pipe[1].getFd()); //JNI call (formerly returned a byte[])
return pipe[0];C:
unsigned char* jpeg = NULL;
unsigned long jpegSize = 0;
getThumbnail(env, &jpeg, &jpegSize, rawProcessor); // Populates jpeg thumb, works when converted to byte[] in second segment
FILE* out = fdopen(dest, "wb");
int written = fwrite(jpeg, 1, jpegSize, out);
return TRUE;当我转换为byte[]时,一切都很好,只是显然不在ContentProvider中:
jbyteArray thumb = env->NewByteArray(jpegSize);
env->SetByteArrayRegion(thumb, 0, jpegSize, (jbyte *) jpeg);
free(jpeg);
return thumb;当我调试它到fwrite时,堆栈跟踪似乎就消失了。从来没有击中return TRUE或return pipe[0],但也不会崩溃或抛出。很奇怪..。
有人做过类似的事吗?仅仅将二进制写到“写”管道就足够了吗?我在这里做了什么根本的错事吗?谢谢。
更新(与@pskink讨论后)
我尝试实现PipeDataWriter。我以FileProvider.java为例。
@Override
public void writeDataToPipe(@NonNull ParcelFileDescriptor output, @NonNull Uri uri, @NonNull String mimeType, @Nullable Bundle opts, @Nullable byte[] args)
{
try (FileOutputStream fout = new FileOutputStream(output.getFileDescriptor()))
{
fout.write(args, 0, args.length);
}
catch (IOException e)
{
Log.e(TAG, "Failed transferring", e);
}
}byte[] rawData = ImageUtil.getRawThumb(fd.getParcelFileDescriptor().getFd());
return openPipeHelper(Uri.parse("invalid"), "image/jpg", null, rawData, this);然而,当我使用上面的传输线程时,我得到了相同的错误:
java.io.IOException:写入失败: EBADF (坏文件描述符) 在libcore.io.IoBridge.write(IoBridge.java:498) 在java.io.FileOutputStream.write(FileOutputStream.java:186) 在com.anthonymandra.content.MetaProvider.writeDataToPipe(MetaProvider.java:273)
和
java.io.IOException:写入失败: EPIPE (断管) 在libcore.io.IoBridge.write(IoBridge.java:498) 在java.io.FileOutputStream.write(FileOutputStream.java:186) 在com.anthonymandra.content.MetaProvider.writeDataToPipe(MetaProvider.java:273)
当我穿行以确保图像的数据正常时,我发现所有的东西都加载得很好。在我看来,这实际上是一个线程安全问题。
https://stackoverflow.com/questions/42954047
复制相似问题