关于JAVA调用C++的dll中的一个疑问。
DLL中有一个byte4维数组,大小我定义为400*400*10*10。这样我用javaJNI调用的时候就会出现堆栈溢出。
我开始一直没有想明白,后来发现这个太大,于是我重新在DLL定义300*300*10*10 就正确了。但是,如果我不是用JNI调用DLL。而是直接在java代码中定义400*400*10*10的四维数组,又不会出现这个问题。各位大神能给我一个正确的解释么?

解决方案 »

  1.   

    想问一下你的那个BYTE型怎么改的 我也碰到了同样的问题 悲剧啊
      

  2.   

    这很简单,首先JAVA的数组和C的数组是不同的。
    JAVA的数组是一个对象,而C的数组是一个内存地址分配,而且语言的不同它们之间也存在调用的本质区别,这是两个数组本质的一个区别。
    另外,JAVA中的数组为对象,所以它运行在JAVA虚拟机的堆内存中,一般对内存JAVA虚拟机设置得比较大,或者说是足够大,而C的数组内存是本地方法内存,在非堆内存中,这一部分内存一般默认设置比较小,因此你能够在java代码中用一个那么大的数组不会溢出,而在C中会溢出,最后说明,如果你用java来驱动C模块,那么C模块的内存也会被JAVA虚拟机管理起来。
      

  3.   

    你的数组是在方法内定义的吧?方法内定义的任何变量,其实是通过压栈的方法实现的。而这个栈的大小,貌似默认是1M。所以,你有两种方法:
    一,编译时设置栈的大小。
    二,不用数组,用指针,动态分配内存,动态分配的这块内存,不是通过压栈的,可以相当相当大,嘿嘿。
    比如:int *b=new int[n]。这样是不会有问题滴