Java通过JNI调用C/C++动态链接库之参数传递及结果返回
接上一篇关于JNI的基本入门Java通过JNI调用C/C++动态链接库之HelloWorld,简述给JNI函数传递参数,以及通过JNI函数返回值的方式。
接上一篇关于JNI的基本入门Java通过JNI调用C/C++动态链接库之HelloWorld,简述给JNI函数传递参数,以及通过JNI函数返回值的方式。
Java可以通过JNI(Java Native Interface)来调用本地库,从而解决一些需要使用C/C++来提高效率但却需要使用JAVA调用的场景,例如opencv库编写的图像处理函数,需要使用spark等大数据框架来调用。
网上关于Linux中动态链接库和动态链接库的博客有很多,其实大部分博客都没有分清楚linux下面动态链接库运行时的查找路径跟编译期的查找路径并不相同,导致很多人在编译程序时库引用出错,按教程添加库路径后依然出错。下面一并总结,不涉及太多二进制中ELF的相关内容。
Linux系统中有大量共用的动态链接库和静态链接库,当对程序源代码编译之后进行链接时往往需要引用系统中已经有的动态链接库或静态链接库。关于动态链接库可以简单理解为在链接时只是将动态库中需要引用的内容(包括变量、函数)在目标程序的符号表中创建一个链接,只在运行到该部分调用时才去查看动态链接库,linux下动态链接库通常为libxxx.so,windows下为.dll。而静态链接库是将整个库一并打包到链接后的目标程序中,并直接映射好所需要的符号表,静态链接库后缀通常为.a,windows下通常为.lib。如果也不明白符号表,可以参考实例验证C/C++源代码变成程序的过程
FFmpeg支持大量的音视频压缩格式和编解码格式,通常大家所说的视频格式(format)就可以理解为压缩格式(container)或者混流格式(Muxing),例如avi、mp4、mkv等,它们相当于是一个容器,可以将视频与音频数据包装在一起,并让它们能够按照指定的同步方式输出。
编、解码格式(codec)也就是所谓的视频祼流格式(raw bitstream),视频编码格式也很多,现在使用最多的就是H.264,当然H.265要逐渐引领潮流了。其他的编码格式还有很多,例如MPEG-2、MEPG-4 Part 2、MPEG-4 Part 10等
PS:有人的场合切勿尝试百度搜索什么是视频祼流,万恶的百度,可以google
FFMPEG支持创建多种协议的视频流,举例说明使用FFMPEG创建视频流,以及接受视频流
获取HDFS上的视频文件并通过ffmpeg播放,或者通过ffmpeg将视频流转码后存储到HDFS
有些场景下需要为系统设置代理,比如OpenCV3在进行cmake编译时需要在线从amazon下载一些第三方包。现在多数同学采用的代理方案应该都是基于socks5协议,而默认的终端工具支持的代理类型都是http或https,所以这里需要socks协议到http协议的转换,转换之后采用终端的代理变量设置http代理即可。
Ubuntu 16.04下手动编译OpenCV 3.2.0,并提供对FFmpeg以及CUDA 8的支持来使用GPU加速视频图像处理。
考虑到大数据处理系统spark的需要,这里也同时加入opencv对java的支持。
CUDA程序往往很难高度,特别是核函数出错时,甚至有些情况下核函数中内容访问错误时,运行程序之后系统返回的报错信息是free() error之类的错误,会严重误导错误查找过程。所以编写CUDA程序一定记得进行错误错误处理,多写几行代码,有可能省出很多的时间。假如自己的CUDA程序出现了各种奇葩、难以理解的错误,可以考虑加上错误处理,也许就柳岸花明了。
在CUDA学习笔记最后的总结中刻意提到编写CUDA程序一定要做错误处理,但其中一直未提及如何进行错误处理,这里给补上。
python 2.7.13中采用print输出内容后,通过terminal的管道重定向到文件时出错:
1 | UnicodeEncodeError: 'ascii' codec can't encode characters in position 19-20: ordinal not in range(128) |
应该是编码的问题,然后就搜索发现python处理的代码文件的编码,系统默认编码都不一样,虽然可以通过对str进行decode(‘gbk’)的方式将中文正常输出,但重定向时,由于系统编码不一致,导致上述错误。可以通过设置系统编码来解决:
1 | reload(sys).setdefaultencoding("utf8") |
使用场景,通过requests获取中文网页,为了方便日常分析使用,会考虑将内容正常输出到标准输出,然后需要输出到文件时再进行重定向,而且还希望文件编码格式统一采用utf-8,代码如下:
1 | # ... |
这样即可以正常输出中文到标准输出,也可以将其正常重定向到文件,而且不需要修改系统的默认文件编码
参考:
1.http://stackoverflow.com/questions/15530635/why-is-sys-getdefaultencoding-different-from-sys-stdout-encoding-and-how-does
2.http://stackoverflow.com/questions/11741574/how-to-print-utf-8-encoded-text-to-the-console-in-python-3