请参阅MSO问题可能重复的长列表 - C内存分配和超限界限,以获取有关密切相关问题的信息.
开发人员环境:CentOS 4.7,Kdevelop 3.1.1,gcc 3.4.6
我运行一个Java测试客户端,使用JNI加载C++共享库.我的应用程序有三个组件,
Java客户端
C++共享库,充当JNI包装器.(我称之为"wrapperlibrary")
包含业务对象的C++共享库.(我称之为"businesslibrary")
当我运行客户端时,我经常遇到错误,即*** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***
.此错误大约10到11次,然后应用程序运行.
在我的Java客户端中,我首先在静态ctor中加载所需的C++库,如下所示,
static { System.Load("/root/Desktop/libs/businesslibrary"); System.out.println("business library loaded"); System.Load("/root/Desktop/libs/wrapperlibrary"); System.out.println("wrapper library loaded"); }
"业务库已加载"语句将打印在控制台上,但之后会出现错误*** glibc...
.
在wrapperlibrary的项目设置中,businesslibrary被指定为依赖库.所以,即使我省略了加载businesslibrary并且只是写的调用,
static { System.Load("/root/Desktop/libs/wrapperlibrary"); System.out.println("wrapper library loaded"); }
然后首先加载businesslibrary(通过全局变量创建日志记录看到),然后加载wrapperlibrary.控件返回到java客户端,并在控制台上打印语句"wrapper library loaded".在此之后,调用本机方法.但控件永远不会达到这种本机方法的实现.而在此之前,错误*** glibc...
再次出现.另外如果我在本机方法调用之前插入对另一个java类的静态方法的调用,例如,
static { System.Load("/root/Desktop/libs/wrapperlibrary"); System.out.println("wrapper library loaded"); System.out.println(Try.temp()); //where temp is a static method of Try class which returns a string. native method call; -- -- }
那么Try.temp()的输出永远不会打印出来.
在这两种方法中可能出现问题的可能原因是什么?我该如何处理?