如何解决Android NDK - 从 C 代码填充 Java 的字节数组
我有一个需要从 C 运行的代码(使用 C 库,而且它的性能很重要并且涉及大量循环迭代)。 代码需要解码图像并对其运行一些操作。最终结果应该是Android/Java的位图。
由于高分辨率和需要在没有任何缩放的情况下显示图片,这会产生性能问题。
我有我正在重用的预先分配的位图,以避免过多的分配和垃圾收集。目前,我已经设法完成了概念验证所需的所有工作,我是这样做的:
public static void fillNativeBitmap(String src,Bitmap bmp) {
byte[] nativeBytes = getNativeBytesARGB8(src);
bmp.copyPixelsFromBuffer(ByteBuffer.wrap(nativeBytes));
}
JNIEXPORT jbyteArray JNICALL
notImportantForQuestion_getNativeBytesARGB8(
JNIEnv *env,jclass clazz,jstring src
) {
char *src_file;
unsigned char *imptr;
src_file = (*env)->GetStringUTFChars(env,src,NULL);
const int total_pixels = xxx;
static unsigned char mptr[xxx];
decodeOneStep(src_file,&imptr); //uses lodepng to decode bitmap file
doStuffWithImage(imptr,mptr);
jbyteArray result = (*env)->NewByteArray(env,total_pixels); //here - unnececeary allocation for GC?
(*env)->SetByteArrayRegion(env,result,total_pixels,mptr);
(*env)->ReleaseStringUTFChars(env,src_file);
free(imptr); //I can live with that
return result;
}
我想重用 Java 的位图缓冲区,将它传递给 C 并在那里填充它。但是,从 C 访问 java 数组的方法需要指向“isCopy”的指针。访问 Java 数组的副本对我来说根本不起作用,因为我不需要来自 C 上下文的 Java 数据,我只需要 C 上下文来填充 Java 数据。
在这种情况下我应该使用什么方法?如何以最佳方式实现它?我正在尝试优化性能和稳定性,后者包括保持尽可能低的分配数量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。