有关密切相关问题的信息,请参阅 MSO 问题A long list of possible duplicates — C memory allocation and overrunning bounds 。
开发环境:CentOS 4.7、Kdevelop 3.1.1、gcc 3.4.6
我运行一个 Java 测试客户端,它使用 JNI 加载一个 C++ 共享库。我的应用程序中有三个组件,
- Java 客户端
- 充当 JNI 包装器的 C++ 共享库。(我将其称为“包装库”)
- 包含业务对象的 C++ 共享库。(我称之为“商业图书馆”)
当我运行客户端时,我经常遇到一个错误,即*** 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 客户端,并在控制台上打印语句“已加载包装库”。在此之后,将调用本机方法。但是控件永远不会到达这个本机方法的实现。而在此之前,错误*** 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() 的输出永远不会被打印。
这两种方法中出现问题的可能原因是什么,我应该如何进行?