一个内存jpeg解码的work around

项目需要,需解码内存jpeg

第一想到了turbojpeg,原生支持,ubuntu下代码已经有了,改了改,测试可以正常解码成rgb24,经libyuv转rgb32 到nv21

好,之前编的有android turbojpeg,java和jni都写好了,集成测试,竟然图像全乱,日

调了半天,dump数据还是老样子

没办法,android.mk把ubuntu下的testbed编译成executable,在android命令下执行,日,加-fpie -fPIE。搞完了,测试竟然不行,不过提示图像不全

网上dump了个jpeg文件,竟然提示huffman不对,疯了,没想到turbojpeg这样的

想想,又用ndk重新编了好几个版本,把neon优化去掉,纯c代码来运行,还是一样,用android sourcecode里面的jpeg来编译,运行还是一样,但是ubuntu下就好的

放弃了,中间要用了apk调用jni来运行,因为apk没加读写sdcard的权限,全失败,加了,最后也是一样

放弃,发了邮件,晚上想了想,好难受

其实公司有一套解码的东西,不过只支持filename和公司内部的stream结构解码

没办法,只能用这个全家桶

扫描二维码关注公众号,回复: 3272458 查看本文章

首先想到的用mmap和mktemp来虚拟个filename,担心要写io,或者读的数据不对

最后找到了fmemopen这个函数,公司stream结构不暴露出来,找了半天才找到了它的细节,除去无关紧要的东西,就是FILE*了

开搞了,很快就自己构建个stream送入解码库

ndk build失败了,stdio.h已经加了,直接进去看,stdio.h里面没有fmemopen,意思就是ndk里面的libc没fmemopen,用了21platform了

只能去android 6.0 的source code里面bionic看有没有,里面竟然有,fmemopen.c函数,copy出来,编译又需要什么tag文件,还有一堆其它的,没法用,放弃

直接去out目录下grep fmemopen,有,于是用了静态库libc.a. 当时想不能和系统的libc冲突,改了libC。能编译能运行,测试竟然可以生成nv21了

先用executable,提示has text relocation不让我运行,改了半天,放弃了,用java jniz中间调用执行了一下


开始集成进项目,crash,好奇怪,反复改回去改回来,搞了半天,发现libC这个库和系统的冲突了,通过crashlog得到new失败,只能替换它了,加了libc到ld_libs,不行,调整顺序也不可以

直接用了-no-stdlib,代码里面加extern "C" int atexit(void (*)()) {},编译竟然还不行,把libC.a解包去掉new再打包,编译竟然提示乱七八糟的东西

想到用了no-stdlib,就用了android source code 里面的libc.so了,提示出错,加extern "C" { void* __dso_handle = 0;}



到现在可以了


中间还提示7.0特有的so has text relocation 窗口,重新找到一堆加了-fPIC的库,并交换库的顺序解决问题。

因为提示用c++filt看到new出错,就用了全局的对象,也不行,不知道是不是不行还是没完全重新安装

没办法,都是一步一步注释代码才调到libC,中间还怀疑有库或者头文件重载了new,竟然还改了java native接口去掉下划线,也是醉了



工程机,有时并不能重新安装apk也坑了一断时间,后来都是卸载再安装的


猜你喜欢

转载自blog.csdn.net/starpicker/article/details/71481484