程序分为两部分,java部分与c++部分,在c++使用JNI访问Java资源。在JNI中,我为了效率,将所有用到的类、方法和属性都用全局static变量缓存起来。现在的问题是,在java中,有一个for循环,会多次调用java的本地方法,也就是对应的c++函数,在每次c++函数返回后,c++函数要出栈,程序回到java层面上,这个时候,c++中的那些全局static变量的值会在c++函数返回的时候全部被清空吗?或者被类似的机制回首,我感觉这些变量毕竟是static,不保存在c++函数栈中,在c++返回后,下一次c++调用发生的时候,可以直接引用这些全局static变量。

解决方案 »

  1.   

    不能进I/O操作,c++部分执行的是一个非常耗时的算法,因此才用native方法,使用c++重写,以期提高效率
      

  2.   

    不要期望C++给你提高效率,我曾经编写一个软件,期望在10分钟内处理300M的文本,编写出来的手板软件处理时间大约为11-30分钟不等,后来我修改了一些算法,具体来说是大量建立对象,时间可以控制在2分钟之内 
    再说,现在Java对数据的处理速度决然不输于C++了 
    我主要是为了给Java装个C外壳才学了点C++的
      

  3.   

    我是写一个cuda的程序,要调用系统CUDA的库,只能用c/c++做为中间层,所以用JNI是没有选择,而CUDA的目的就是加快运算速度,所以效率是很重要
      

  4.   

    for循环多次调用本地方法不是一个好的做法,jni也是需要一点性能代价的,所以尽量在本地方法中做更多的事情。
      

  5.   

    首先解决你的主要问题。
    对于对象的回收,是由虚拟机回收还是由native方法中回收,取决于对象最终归属,如果你的对象是java中生成,传入到native方法中,并未被返回,那么在native中手动free掉,不然内存泄露。如果你的对象是C中生成,return至java中,则由虚拟机自动回收,至于static属性以及成员属性,会随着对应的类与对象的回收而回收掉。
    然后是效率问题,从执行速度上来说,C++的执行速度肯定是优于JAVA的,但是这种优于并不是建立在一种简单的语言对比上,而是实现的具体情况上,原因很简单,其实算法指令速度C++与JAVA差距微乎其微,可以忽略,只是C++很多事情你要自己去完成,但是你可以控制和参与,JAVA很多事情帮你做了,但是你不能控制和参与,例如算法,例如安全砂箱,代码验证,内存回收,各种内存检索和查询等待。那么C++与JAVA的效率差距就体现在这些问题上,如果你是个很NB的程序员,可以很优秀的处理这些问题,你用C++完成工作,会优于JAVA,但是效果还不是很明显,如果你是个菜,那可以很悲剧告诉你,你用C++的工作很可能不仅仅是效率问题,而是灾难。
    最后是调用问题,JAVA与JNI接口的桥接本身消耗的资源是比较大的,毕竟是两种不同语言之间的通信,因此不建议过于频繁的调用jni接口,要么尽量在java中完成,要么尽量在jni中完成,接口通信次数越少越好。