关于JAVA调用C++的dll中的一个疑问。
DLL中有一个byte4维数组,大小我定义为400*400*10*10。这样我用javaJNI调用的时候就会出现堆栈溢出。
我开始一直没有想明白,后来发现这个太大,于是我重新在DLL定义300*300*10*10 就正确了。但是,如果我不是用JNI调用DLL。而是直接在java代码中定义400*400*10*10的四维数组,又不会出现这个问题。各位大神能给我一个正确的解释么?
DLL中有一个byte4维数组,大小我定义为400*400*10*10。这样我用javaJNI调用的时候就会出现堆栈溢出。
我开始一直没有想明白,后来发现这个太大,于是我重新在DLL定义300*300*10*10 就正确了。但是,如果我不是用JNI调用DLL。而是直接在java代码中定义400*400*10*10的四维数组,又不会出现这个问题。各位大神能给我一个正确的解释么?
JAVA的数组是一个对象,而C的数组是一个内存地址分配,而且语言的不同它们之间也存在调用的本质区别,这是两个数组本质的一个区别。
另外,JAVA中的数组为对象,所以它运行在JAVA虚拟机的堆内存中,一般对内存JAVA虚拟机设置得比较大,或者说是足够大,而C的数组内存是本地方法内存,在非堆内存中,这一部分内存一般默认设置比较小,因此你能够在java代码中用一个那么大的数组不会溢出,而在C中会溢出,最后说明,如果你用java来驱动C模块,那么C模块的内存也会被JAVA虚拟机管理起来。
一,编译时设置栈的大小。
二,不用数组,用指针,动态分配内存,动态分配的这块内存,不是通过压栈的,可以相当相当大,嘿嘿。
比如:int *b=new int[n]。这样是不会有问题滴