tags:

views:

470

answers:

1

Developer environment: CentOS 4.7, Kdevelop 3.1.1, gcc 3.4.6

I run a java test client that loads a C++ shared library using JNI. There are three components in my application,

  1. Java client
  2. C++ shared library which acts as a JNI wrapper. (I will call it "wrapperlibrary")
  3. C++ shared library containing business objects. (I will call it "businesslibrary")

When I run the client I face an error very frequently which is, *** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***. This error comes for around 10 - 11 times and then the application runs.

In my java client, I first load the required C++ libraries in a static ctor as follows,

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");
}

The statement "business library loaded" gets printed on the console but after it the error *** glibc... comes.

In the project settings of wrapperlibrary, the businesslibrary is specified as a dependant library. So, even if I omit the call to load businesslibrary and just write,

static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}

then firstly the businesslibrary gets loaded(seen through global variable creation logging) and then the wrapperlibrary gets loaded. The control returns back to java client and the statement "wrapper library loaded" is printed on console. After this there is a call to native method. But the control never reaches this native method's implementation. Rather before that the error *** glibc... again comes. Also if I insert a call to static method of another java class before native method call such as,

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;

 --
 --
}

then output of Try.temp() never gets printed.

What could be the possible reasons for the problem in both these approaches and how should I proceed?

A: 

It could be that Java itself is linked against a different glibc than your libraries or that the libraries are linked differently/to different glibcs.
Also check if one of the libraries is linking against a debug version of the glibc (hat that problem on windows with the C++ runtime lib). Try linking your libraries staticly against the glibc, or for the sake of excluding possibilities linking your wrapper and business libs staticly into one library.

Dominik Fretz
The solution is somewhat similar to your suggestion - it relates to linking. The business library has its own overridden implementation of wide char apis since it is working on 2 byte Unicode. It was expected to link to these apis but rather got dynamically linked to system apis which expect a size of 4. I have changed the names of overridden apis to correct this. Now both the wrapper and business library link with the overridden apis. Thanks.
HS