以前都是用c++和opencv处理图像,这次要求用java,刚上手很不适应。c++的程序中到处都是指针*还有**,但在java中可没有*更没有**,当然opencv在java和c++中编程上并不会差很多。另外还有一个就是效率了(本人用的是win7,在其他操作系统上就不知道了),首先是程序的运行效率,java肯定是比不上c++的,因为java程序的运行还需要jvm。而java提供jni也就是为了和其他语言兼容,从而提高运行效率,至于为什么说可以提高运行效率,下面会说到。其次就是编写程序的效率,正如上篇写到的编写dll,非常麻烦。
我没看到单纯的用java编写的很复杂的处理图像的程序,不知道是不是因为opencv本来就是用c和一些c++编写的,还是上面说的效率问题。而对于比较复杂的程序几乎都是调用dll。c++的dll(dynamic link library在win中这么叫)是机器码,和exe一样,只是exe是一个完整的程序,是一个主体。而dll可以说是一个可运行的分支,只有在exe需要他时才调用dll,这时他才被装载进内存并运行。(应该也可以好几个同时运行吧?就像多线程)。所以说dll本身就是一个可运行的程序!这样的话java调用dll也就是java程序通过jni接口启动了另一个c++程序,而这个dll的运行跟jvm的运行可以说没什么关系了,jvm是运行在操作系统层面,dll也是运行在操作系统层面(当然除了dll和java程序的一些参数交换,,,,)。而jni的的确确也就是一个接口,java通过这个接口告诉操作系统找到这个dll,并运行这个dll。说到底,java调用dll处理图像还是用c++处理图像,因为大量的算法都是封装在dll中的,真正的java程序也就是程序启动,初始化一些参数而已。而上面说到c++的效率是要比java的运行效率高的。从而提高了java的运行效率。
所以,java调用dll并没有像想象中那样和c++有着非常紧密的结合,也没有想象中的那样复杂。除了那个接口结合了c++和java。其他地方c++和java还是你走你的阳光道,我走我的独木桥,各自运行各自的程序!