gpt4 book ai didi

java - JNI 中的 ParcelFileDescriptor.createPipe

转载 作者:太空宇宙 更新时间:2023-11-04 11:39:23 24 4
gpt4 key购买 nike

我正在尝试弄清楚如何在 ContentProvider.openFile 中传递数据流。要发送的数据是在 JNI 中创建的。我尝试使用传输线程创建管道,但由于管道损坏而遇到了很多麻烦。所以我想我可以将“写入”管道传递给 JNI 并将数据直接写入其中。

Java:

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 TRUEreturn pipeline[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: write failed: EBADF (Bad file descriptor)
at libcore.io.IoBridge.write(IoBridge.java:498)
at java.io.FileOutputStream.write(FileOutputStream.java:186)
at com.anthonymandra.content.MetaProvider.writeDataToPipe(MetaProvider.java:273)

java.io.IOException: write failed: EPIPE (Broken pipe)
at libcore.io.IoBridge.write(IoBridge.java:498)
at java.io.FileOutputStream.write(FileOutputStream.java:186)
at com.anthonymandra.content.MetaProvider.writeDataToPipe(MetaProvider.java:273)

当我逐步检查图像数据是否正常时,我发现一切都加载正常。在我看来这实际上是一个线程安全问题。

最佳答案

实际上有很多事情出了问题,所有的事情都卷成一团困惑:

  1. 我没有在finally 中关闭ParcelFileDescriptor
  2. 我使用Glide对于图像缓存,当您加载 Uri 时,它使用两个 getter ,这意味着 openFile 正在 called twice per file .
  3. (2) 导致无尽的断管错误。
  4. StrictMode 由于 (1) 而终止了应用程序,而我在 (3) 的一系列错误中错过了它。

关于java - JNI 中的 ParcelFileDescriptor.createPipe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42954047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com