String's equals() method return wrong when using the generic C implementation of Android's Dalvik VM.

by Peter » Tue, 28 Apr 2009 14:43:25 GMT

Sponsored Links

I'm porting Android on a new architecture called XBurst, just like arm
and x86.

I did the following things:

1. Build a new toolchain for XBurst.
2. Porting the Linux 2.6.27 kernel to XBurst.
3. Porting the Android libc called bionic to XBurst (added syscalls,
linker etc.)
4. Use the generic C implementation of Dalvik VM (the quicker way for
me, next I will port it to XBurst)

Now, Android can be run successfully on XBurst and most applications
work normally.

But there is one problem with the String's equals() method. Some Java
codes using this method
get a wrong return value. For example:

String str1 = "android.intent.action.VIEW";
String str2 = "android.intent.action.PICK";
String str3 = "android.intent.action.GET_CONTENT";
Boolean res1, res2;

res1 = str1.equals(str2);
res2 = str1.equals(str3);

I ran these codes on the Android's emulator and they returned
res1=false and res2=false. (They are correct)

But when I ran them on XBurst, they returned res1=true and res2=false.
(They are wrong)

I did several tests with different strings and found that when the two
strings have different length, the method
can return a correct value. While they have the same length, the
method return a wrong value.

Then I ran above codes with dalvikvm on the command shell, and found
that they returned res1=false
and res2=false. (They are correct)

The difference is that the wrong one was got when the Android runtime
startuped and while the correct
one is just running .jar file on the command shell with dalvikvm.

So I guessed this should be the Android runtime problem when using the
generic C implementation of Dalvik VM.

Can anyone tell me the true reason? Is it a bug of the Android runtime
codes? Or is there other ways to help me to locate the issue?

Any suggestions are appreciated.




String's equals() method return wrong when using the generic C implementation of Android's Dalvik VM.

by fadden » Wed, 29 Apr 2009 02:24:17 GMT


There might be something else at work, depending on how exactly you're
going about things.

The optimizations performed by "dexopt" include a form of instruction
inlining.  For a handful of methods, listed in the gDvmInlineOpsTable
in dalvik/vm/InlineNative.c, the method call is replaced with an
instruction that performs the desired action without any of the method
overhead.  The actual implementation doesn't run any faster than a
method declared "native", but we can skip all of the stack frame prep
and other method call overhead, so it's useful for simple methods that
are called very frequently.

Typically your String.equals() call will end up in
javaLangString_equals() in InlineNative.c.  This may use an Android-
specific ARM "memcmp16" function, or do a simple iterative loop in C.
The result goes into "pResult->i", and the function returns "true" to
indicate that no exception was thrown.

If for some reason "dexopt" didn't optimize the code that calls
String.equals(), you will call the implementation in

I looked over the code and all of the implementations seem correct.
They all test the length before comparing characters, so I can see how
you could get the results you described above if one of the comparison
loops was broken.

When invoking Dalvik from the command line, you can control which
interpreter runs with "-Xint"; use "-Xint:portable" or "-Xint:fast".
You can control DEX optimizations with -Xdexopt, e.g. -Xdexopt:none to
disable it.  You can verify what it did by running "dexdump -d" on the
optimized file in /data/dalvik-cache.  Note the file doesn't get
regenerated if it doesn't need to be, so remove the /data/dalvik-cache
entry before running dalvikvm with a different "-Xdexopt" option.



Sponsored Links

String's equals() method return wrong when using the generic C implementation of Android's Dalvik VM.

by Peter » Wed, 29 Apr 2009 09:32:16 GMT

 i fadden,

Thanks for your suggestions.

Sure I traced the String.equals and found that some codes call the
implementation in, while the test code of mine didn't call
it. Then I followed your advice to trace the inline native
in dalvik/vm/InlineNative.c, luckily that it was called.

Then I checked the code in InlineNative.c carefully. They are all
And then the __memcmp16() in my implementation. And finally I found
that my __memcmp16() was wrong. In my implementation, I think that
the third parameter "size_t count" is in byte-length. While by reading
InlineNative.c I knowed that it is in short-length, but not byte-
So my __memcmp16() return a wrong value to "pResult->i" when the
two strings have the same length.

And now by fixing __memcmp16(), the test code ran well and can return
the correct result.

Thanks fadden again.

You know that my work is to porting Android to a new architecture
different from arm and x86. So almost everything needs to be added
for me, the toolchain, the kernel, the bionic C library, then the
VM. The problem of String.equals was caused by the bionic C library.
And your advice helped me to locate and fix the issue.


On 49 24 fadden <> wrote:


Other Threads

1. IMAP Email message body is "null"

Not sure if this is where bug reports go, but in lieu of a known
tracking mechanism here's my bug:

Synopsis: IMAP Email message body is "null"

Platform: T-Mobile G1

Issue: Using IMAP Email client, some messages contain a body
consisting of the word "null".  This is using the Sun Java System
Messaging Server.  The issue does not happen on all emails, just mail
from a particular sender; usually the sender is from an automated
email system, such as Clarify or Radiance.

Notes: Viewing the same emails from Thunderbird show the whole



2. Starting Android Service at boot time

I am writing an application that has a service that runs a background
thread and polls web services.  The service creates notifications
using the NotificationManager.  The service needs to be running when
the phone is first booted and the user does not need to start an
activity to start the service.

What is the standard way to launch application service without user
intervention?  I could find any documentation that describes the

Thank you,



3. Html5 Client-Side Storage support for android

4. Interested in LBS & AR? Android Developer Needed

5. Intercept incoming call

6. Html5 Client-Side Storage support for android

7. Affected by the MapsAPI-Tos only when (uses-library android:name="" /) ?