I've now followed the Felix code through to the source of this problem which 
appears to be in ModuleImpl:

static
    {
        ClassLoader cl = null;
        try
        {
            Constructor ctor = m_secureAction.getDeclaredConstructor(
                SecureClassLoader.class, new Class[] { ClassLoader.class });
            m_secureAction.setAccesssible(ctor);
            cl = (ClassLoader) m_secureAction.invoke(ctor, new Object[] { null 
});
        }
        catch (Throwable ex)
        {
            // On Android we get an exception if we set the parent class loader
            // to null, so we will work around that case by setting the parent
            // class loader to the system class loader in getClassLoader() 
below.
            cl = null;
            System.err.println("Problem creating boot delegation class loader: 
" + ex);
            ex.printStackTrace();
        }
        m_defBootClassLoader = cl;
    }

This seems to be trying to create a new instance of SecureClassLoader, which is 
failing because SecureClassLoader doesn’t have any public constructor. This is 
therefore throwing an InvocationTargetException and is, I believe responsible 
for the problem I’m seeing. Has this been reported as a bug, does anyone know?

Thanks

Bruce

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

> Yes, I'm aware of that. What I meant was that I've seen that it works on
> Felix releases with the framework version set to 1.2, but I can't get this
> working with the current release.
>
>
> On 30/04/2010 17:03, "Richard S. Hall" <he...@ungoverned.org> wrote:
>
>> On 4/30/10 9:50, Jackson, Bruce wrote:
>>> I've added the lines:
>>>
>>> // calculate the export packages list from the environment
>>>
>>> config.put("org.osgi.framework.system.packages",
>>> ANDROID_FRAMEWORK_PACKAGES);
>>> config.put("org.osgi.framework.bundle.parent", "app");
>>> config.put("felix.log.level", "1");
>>>
>>> and tried this with app, framework, boot and also ext, but I get the same
>>> result I'm afraid. I've certainly seen out on the web that people have done
>>> with with almost identical code on earlier version of Felix (I can't be sure
>>> of the exact Felix version, but the org.osgi.framework version was set to
>>> 1.2) but is it possible that has become broken in recent releases?
>>>
>>
>> That is the version of the OSGi spec, check in the
>> org.apache.felix.framework.Felix.properties file...
>>
>> -> richard
>>
>>> Thanks
>>>
>>> Bruce
>>>
>>> On 30/04/2010 13:34, "Karl Pauls"<karlpa...@gmail.com>  wrote:
>>>
>>>
>>>>   In case you have problems on android not finding classes that you are
>>>> making available via the system bundle, make sure you set the
>>>> org.osgi.framework.bundle.parent property to the correct value (either
>>>> app or framework, depends). i.e.,
>>>>
>>>> org.osgi.framework.bundle.parent=app
>>>>
>>>> or
>>>>
>>>> org.osgi.framework.bundle.parent=framework
>>>>
>>>> that should make it work.
>>>>
>>>> regards,
>>>>
>>>> Karl
>>>>
>>>> On Fri, Apr 30, 2010 at 1:38 PM, Jackson, Bruce<bru...@qualcomm.com>
>>>> wrote:
>>>>
>>>>> 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:>>>>>
>>>>>  3
>>>>> 3)
>>>>> 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.j>>>>>
>>>>>  a
>>>>> va
>>>>> :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