As a continuation to this mini-saga, I now have the initial problem (i.e. 
bundle resolution) fixed with the code below. When I add bundles to the running 
Felix framework, the resolve correctly, and start as long as their activator 
does not try to load any of the classes found in ANDROID_FRAMEWORK_PACKAGES, 
such as android.util.Log. If they do, I get a ClassNotFoundException:

04-30 12:36:25.788: DEBUG/dalvikvm(16018): Making a copy of 
Lcom/skifta/android/mediaserver/AndroidTestImpl;.test4 code (68 bytes)
04-30 12:36:25.798: WARN/System.err(16018): org.osgi.framework.BundleException: 
Activator start error in bundle com.skifta.booster.cdir [4].
04-30 12:36:25.798: WARN/System.err(16018):     at 
org.apache.felix.framework.Felix.activateBundle(Felix.java:1807)
04-30 12:36:25.798: WARN/System.err(16018):     at 
org.apache.felix.framework.Felix.startBundle(Felix.java:1682)
04-30 12:36:25.798: WARN/System.err(16018):     at 
org.apache.felix.framework.BundleImpl.start(BundleImpl.java:905)
04-30 12:36:25.798: WARN/System.err(16018):     at 
org.apache.felix.framework.BundleImpl.start(BundleImpl.java:892)
04-30 12:36:25.798: WARN/System.err(16018):     at 
com.skifta.android.client.SkiftaService.startOSGi(SkiftaService.java:401)
....
04-30 12:36:25.798: WARN/System.err(16018): Caused by: 
java.lang.NoClassDefFoundError: android.util.Log
04-30 12:36:25.798: WARN/System.err(16018):     at 
com.skifta.android.mediaserver.AndroidTestImpl.test1(AndroidTestImpl.java:33)
04-30 12:36:25.798: WARN/System.err(16018):     at 
com.skifta.booster.cdir.Activator.start(Activator.java:43)
04-30 12:36:25.798: WARN/System.err(16018):     at 
org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:661)
04-30 12:36:25.798: WARN/System.err(16018):     at 
org.apache.felix.framework.Felix.activateBundle(Felix.java:1760)
04-30 12:36:25.798: WARN/System.err(16018):     ... 17 more


Any idea why the classloader is not allowing bundles I start to see the classes 
in the packages exported by the framework?

private static final String ANDROID_FRAMEWORK_PACKAGES = ("org.osgi.framework; 
version=1.4.0," +
            "org.osgi.service.packageadmin; version=1.2.0," +
            "org.osgi.service.startlevel; version=1.0.0," +
            "org.osgi.service.url; version=1.0.0," +
            "org.osgi.util.tracker," +
            "android; " +
            "android.app;" +
            "android.content;" +
            "android.database;" +
            "android.database.sqlite;" +
            "android.graphics; " +
            "android.graphics.drawable; " +
            "android.graphics.glutils; " +
            "android.hardware; " +
            "android.location; " +
            "android.media; " +
            "android.net; " +
            "android.net.wifi; " +
            "android.opengl; " +
            "android.os; " +
            "android.provider; " +
            "android.sax; " +
            "android.speech.recognition; " +
            "android.telephony; " +
            "android.telephony.gsm; " +
            "android.text; " +
            "android.text.method; " +
            "android.text.style; " +
            "android.text.util; " +
            "android.util; " +
            "android.view; " +
            "android.view.animation; " +
            "android.webkit; " +
            "android.widget; " +
            "com.google.android.maps; " +
            "com.google.android.xmppService; " +
            "javax.crypto; " +
            "javax.crypto.interfaces; " +
            "javax.crypto.spec; " +
            "javax.microedition.khronos.opengles; " +
            "javax.net; " +
            "javax.net.ssl; " +
            "javax.security.auth; " +
            "javax.security.auth.callback; " +
            "javax.security.auth.login; " +
            "javax.security.auth.x500; " +
            "javax.security.cert; " +
            "javax.sound.midi; " +
            "javax.sound.midi.spi; " +
            "javax.sound.sampled; " +
            "javax.sound.sampled.spi; " +
            "javax.sql; " +
            "javax.xml.parsers; " +
            "junit.extensions; " +
            "junit.framework; " +
            "org.apache.commons.codec; " +
            "org.apache.commons.codec.binary; " +
            "org.apache.commons.codec.language; " +
            "org.apache.commons.codec.net; " +
            "org.apache.commons.httpclient; " +
            "org.apache.commons.httpclient.auth; " +
            "org.apache.commons.httpclient.cookie; " +
            "org.apache.commons.httpclient.methods; " +
            "org.apache.commons.httpclient.methods.multipart; " +
            "org.apache.commons.httpclient.params; " +
            "org.apache.commons.httpclient.protocol; " +
            "org.apache.commons.httpclient.util; " +
            "org.json; " +
            "org.w3c.dom; " +
            "org.xml.sax; " +
            "org.xml.sax.ext; " +
            "org.xml.sax.helpers; " +
            "version=1.6.0");

Properties config = System.getProperties();
config.put("org.osgi.framework.startlevel.beginning", 
Integer.toString(SkiftaService.SKIFTA_START_LEVEL));
config.put("org.osgi.framework.storage.clean", "onFirstInit");

// make sure the OSGi cache dir is set to something sensible

File cacheDir = this.getDir("osgi.cache", Context.MODE_PRIVATE);
Log.d(TAG, "setting osgi cache location to: " + cacheDir.getAbsolutePath());
config.put("org.osgi.framework.storage", cacheDir.getAbsolutePath());


// calculate the export packages list from the environment

String sysPackages = 
bootProps.getProperty("org.osgi.framework.system.packages.extra");
config.put("org.osgi.framework.system.packages", ANDROID_FRAMEWORK_PACKAGES);
config.put("felix.log.level", "1");

// Now create an instance of the framework with
// our configuration properties.

Log.d(TAG, "Starting Felix...");
felix = new Felix(config);

// Now start Felix instance.

felix.start();


On 30/04/2010 11:30, "Bruce Jackson" <bru...@qualcomm.com> wrote:

> Actually, the problem is one of syntax, apparently. When you pass in the
> Properties object, the value against the key that was read from the file
> attached (i.e. the standard form of these files) it doesn't work.
>
> The list needs to be comma separated with no additional CR LF characters or
> the parser doesn't do the right thing.
>
> Clearly there must be some form of pre-parsing going on to handle the
> "standard" package lists in Felix.
>
>
> On 29/04/2010 17:30, "Karl Pauls" <karlpa...@gmail.com> wrote:
>
>> It should work, can you try to add a
>>
>> ; \
>>  version=\"1.6.0\"
>>
>> to the end of your package list? i.e.,
>>
>>  org.xml.sax.ext; \
>>  org.xml.sax.helpers; \
>>  version=\"1.6.0\"
>>
>>
>> regards,
>>
>> Karl
>>
>> On Wed, Apr 28, 2010 at 7:41 PM, Jackson, Bruce <bru...@qualcomm.com> wrote:
>>> Hi All
>>>
>>> I have Felix embedded into an Android app, and I'm trying to export the
>>> packages from the Android environment (e.g. android, android.app, etc) into
>>> Felix.
>>>
>>> I have a couple of questions: first, can I still use the pre-4.2
>>> constructor:
>>>
>>> Felix felix = new Felix(Properties props);
>>>
>>> ...and if I do so passing in a properties file which contains a
>>> semicolon-seperated list of packages as per the attached, should I see this
>>> working properly?
>>>
>>> Felix starts ok, but when I try to deploy any bundles to it (for example a
>>> dexified org.apache.log4j) I get a message fro the debugger when I call:
>>>
>>> BundleContent bc = felix.getBundleContent();
>>> bc.installBundle(name, inputStream);
>>>
>>> 04-28 18:31:45.716: ERROR/SkiftaService(6274): Unresolved constraint in
>>> bundle org.apache.log4j [1]: package; (package=javax.xml.parsers)
>>>
>>> ...which seems to suggest that it can't find the package.
>>>
>>> Any ideas?
>>>
>>> Thanks
>>>
>>> Bruce
>>>
>>>
>>
>>
>

Reply via email to