Email to Android Developers

Hi Taras,

I'm trying to run Apache Tuscany on Android as part of my Google
Summer of Code project: Incubating and Android in Delft 1. I've run
all the (modified) source code through retrotranslator but still get
"native method not implemented" errors that I believe are related to
the lack of annotations support on the current Android SDK.

To test Apache Tuscany I'm running a modified calculator project
(setup as an Android project) called calculator-android. I have
imported the Apache Tuscany SCA modules and modified code for Android
into an eclipse workspace. Then I'm running retrotranslator from the
command line as shown below. I'm keeping the target code at java 1.5
but get the annotation related errors when running the calculator-
android as an Android Application. The same thing happens when I try
to convert the code to java 1.4.

$ java -jar /../retrotranslator-transformer-1.2.6.jar -target 1.5 - 
stripannot -embed support -reflection safe -classpath /../ 
retrotranslator-android-1.2.6.jar -srcdir /../workspace/ -verbose 

Any advice you may have will be greatly appreciated. There's more
details on what I'm currently doing in 2 in case you can help.
Thanks in advance.

1 http://cwiki.apache.org/confluence/display/TUSCANYWIKI/Allow+Google+A...
2 http://cwiki.apache.org/confluence/display/TUSCANYWIKI/30may2008

Response from Android Developers

Hi Oscar,

Retrotranslator does it's job by modifying compiled classes in the following
way:

1. Embedding into each class its metadata (including annotations) as one big
character string.
2. Replacing some method invocations, so java.lang.Class.isAnnotationPresent
is being replaced with
net.sf.retrotranslator.android.main.java.lang.Class.isAnnotationPresent etc.
So when you call getAnnotations() on a particular class the code from
retrotranslator-android-1.2.6.jar will parse the corresponding metadata and
return the result.

AFAIK when you run your Android project from Eclipse it both compiles your
sources into classes and the classes into a dex file. So Retrotranslator has
no chance to modify classes in between unless you fix the ADT plugin. The
workaround is not to put your sources into Eclipse and to process it with
javac, Retrotranslator and jar manually. After that you may add the jar to
Eclipse.

If you execute the following line you should obtain mytuscany-android.jar
that is one-third bigger then the original mytuscany.jar and does not
contain references to Java 5 reflection methods.

java -jar retrotranslator-transformer-1.2.6.jar -srcjar mytuscany.jar 
-destjar mytuscany-android.jar  -target 1.5 -reflection safe -stripannot 
-classpath retrotranslator-android-1.2.6.jar 

So the line java.lang.Class.isAnnotationPresent(Class.java:1131) in the
stack trace means that the application is based on non-translated binaries.
Maybe you had successfully processed your classes but Eclipse overwrote them
after that or Eclipse had already created the dex file before you executed
Retrotranslator.

If you're using Eclipse the most elegant way would be to add the translation
step to the ADT plugin source code, but otherwise don't include Tuscany
sources into the project, only include a jar processed by Retrotranslator
and retrotranslator-android-1.2.6.jar.

Cheers,
Taras.

  • No labels