I doubt this problem is related to iPOJO, but it may be worth factoring this
out of the equation by testing with a BundleActivator instead of iPOJO. It
may still fail, but you may get a more meaningful exception.

I created a Mac native bundle about 6 months ago, and was caught out by the
.jnilib extension, which was required on OSX 10.6.3.

Derek


2010/10/12 Thiébault Benoît <[email protected]>

> Hi Derek,
>
> I tried to run it under Linux (changing the Bundle-NativeCode accordingly)
> and got the same result.
>
> The jnilib extension was mandatory in MacOSX early days, it is now supposed
> to supports both (
> http://markmail.org/message/cksb24oiwjszohvl#query:jnilib%20dylib+page:1+mid:nvmhqaimybukzg4l+state:results
> ).
>
> Anyway, if the problem was here, it would crash when using "java
> -Djava.library.path=./lib org.test.jni.HelloWorld" as well, which is not the
> case.
>
> Regarding the OS name, I tried to use MacOSX instead of "Mac OS X" and
> still got the same error. On old equinox versions (prior 3.3 I think), the
> MacOSX alias was not recognized, this is why I chose to be conservative at
> first and used "Mac OS X" instead, which was supported.
>
> Kind regards,
>
> Ben
>
> Le 12 oct. 2010 à 11:57, Derek Baum a écrit :
>
> > System.loadLibrary() on OSX expects the shared library to have a .jnilib
> > extension.
> >
> > So try renaming libHelloWorld.dylib to libHelloWorld.jnilib and adjust
> the
> > Bundle-NativeCode header accordingly. I actually use osname=MacOSX, but
> "Mac
> > OS X" may work too.
> >
> > regards,
> >
> > Derek
> >
> > 2010/10/12 Thiébault Benoît <[email protected]>
> >
> >> Hi everyone,
> >>
> >> I'm trying a very simple JNI example with iPOJO and OSGi.
> >> Basically, I implemented the HelloWorld example provided by SUN (
> >> http://java.sun.com/docs/books/jni/html/start.html) and packaged it as
> an
> >> iPOJO bundle. The HelloWorld.java file looks like this:
> >>
> >>> package org.test.jni;
> >>>
> >>> public class HelloWorld {
> >>>    public native void nativePrint();
> >>>
> >>>    public static void main(String[] args) {
> >>>      (new HelloWorld()).start();
> >>>    }
> >>>
> >>>    public void start() {
> >>>      System.loadLibrary("HelloWorld");
> >>>
> >>>      nativePrint();
> >>>    }
> >>>
> >>>    public void stop() {
> >>>      System.out.println("Goodbye");
> >>>    }
> >>> }
> >>
> >>
> >> While the HelloWorld.c is:
> >>
> >>> #include <jni.h>
> >>> #include <stdio.h>
> >>> #include "org_test_jni_HelloWorld.h"
> >>>
> >>> JNIEXPORT void JNICALL
> >>> Java_org_test_jni_HelloWorld_nativePrint(JNIEnv *env, jobject obj)
> >>> {
> >>>     printf("Hello World!\n");
> >>>     return;
> >>> }
> >>
> >>
> >> The BND configuration is:
> >>
> >>> <plugin>
> >>>      <groupId>org.apache.felix</groupId>
> >>>      <artifactId>maven-bundle-plugin</artifactId>
> >>>      <version>1.4.3</version>
> >>>      <extensions>true</extensions>
> >>>      <configuration>
> >>>              <instructions>
> >>>
> >> <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
> >>>                      <Private-Package>org.test.jni</Private-Package>
> >>>                      <Import-Package></Import-Package>
> >>>                      <Export-Package></Export-Package>
> >>>                      <Include-Resource>
> >>>                              {maven-resources},
> >>>                              lib=src/main/c/lib
> >>>                     </Include-Resource>
> >>>                      <Bundle-NativeCode>
> >>>                              lib/libHelloWorld.dylib;
> >>>                              osname="Mac OS X"
> >>>                        </Bundle-NativeCode>
> >>>              </instructions>
> >>>      </configuration>
> >>> </plugin>
> >>
> >>
> >> and the iPOJO metadata.xml:
> >>> <ipojo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
> >>>      xsi:schemaLocation="org.apache.felix.ipojo
> >> http://felix.apache.org/ipojo/schemas/CURRENT/core.xsd";
> >>>      xmlns="org.apache.felix.ipojo">
> >>>      <component classname="org.test.jni.HelloWorld">
> >>>              <callback transition="validate" method="start"/>
> >>>        <callback transition="invalidate" method="stop"/>
> >>>      </component>
> >>>      <instance component="org.test.jni.HelloWorld" />
> >>> </ipojo>
> >>
> >>
> >> When I run this sample application via command line, it works:
> >>> java -Djava.library.path=./lib org.test.jni.HelloWorld
> >>> Hello World!
> >>
> >> But when I load it in OSGi (equinox), I have the following error:
> >>> [ERROR] org.test.jni.HelloWorld : Code attribute in native or abstract
> >> methods in class file org/test/jni/HelloWorld
> >>> java.lang.ClassFormatError: Code attribute in native or abstract
> methods
> >> in class file org/test/jni/HelloWorld
> >>>      at java.lang.ClassLoader.defineClass1(Native Method)
> >>>      at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
> >>>      at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
> >>>      at
> >>
> org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)
> >>>      at
> >>
> org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:580)
> >>>      at
> >>
> org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:550)
> >>>      at
> >>
> org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:481)
> >>>      at
> >>
> org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:469)
> >>>      at
> >>
> org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:449)
> >>>      at
> >>
> org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
> >>>      at
> >>
> org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:393)
> >>>      at
> >>
> org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:469)
> >>>      at
> >>
> org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:422)
> >>>      at
> >>
> org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:410)
> >>>      at
> >>
> org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
> >>>      at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
> >>>      at
> >>
> org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:338)
> >>>      at
> >>
> org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:232)
> >>>      at
> >>
> org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1197)
> >>>      at
> >>
> org.apache.felix.ipojo.ComponentFactory.loadClass(ComponentFactory.java:220)
> >>>      at
> >> org.apache.felix.ipojo.InstanceManager.load(InstanceManager.java:542)
> >>>      at
> >>
> org.apache.felix.ipojo.InstanceManager.createObject(InstanceManager.java:574)
> >>>      at
> >>
> org.apache.felix.ipojo.InstanceManager.getPojoObject(InstanceManager.java:777)
> >>>      at
> >>
> org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.__stateChanged(LifecycleCallbackHandler.java:156)
> >>>      at
> >>
> org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.stateChanged(LifecycleCallbackHandler.java)
> >>>      at
> >>
> org.apache.felix.ipojo.InstanceManager.setState(InstanceManager.java:441)
> >>>      at
> >> org.apache.felix.ipojo.InstanceManager.start(InstanceManager.java:322)
> >>>      at
> >>
> org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFactory.java:155)
> >>>      at
> >>
> org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:301)
> >>>      at
> >>
> org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:238)
> >>>      at
> >>
> org.apache.felix.ipojo.InstanceCreator$ManagedInstance.create(InstanceCreator.java:343)
> >>>      at
> >>
> org.apache.felix.ipojo.InstanceCreator.addInstance(InstanceCreator.java:89)
> >>>      at org.apache.felix.ipojo.Extender.parse(Extender.java:269)
> >>>      at
> >> org.apache.felix.ipojo.Extender.startManagementFor(Extender.java:208)
> >>>      at org.apache.felix.ipojo.Extender.access$600(Extender.java:52)
> >>>      at
> >> org.apache.felix.ipojo.Extender$CreatorThread.run(Extender.java:682)
> >>>      at java.lang.Thread.run(Thread.java:637)
> >>> [ERROR] org.test.jni.HelloWorld : Code attribute in native or abstract
> >> methods in class file org/test/jni/HelloWorld
> >>> [ERROR] iPOJO Instance Creator : A matching factory was found for
> >> {component=org.test.jni.HelloWorld, instance.name
> =org.test.jni.HelloWorld-0},
> >> but the instantiation failed : The configuration is not correct for the
> type
> >> org.test.jni.HelloWorld : Code attribute in native or abstract methods
> in
> >> class file org/test/jni/HelloWorld
> >>>
> >>
> >>
> >> What did go wrong?
> >>
> >> Kind regards,
> >> Ben
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: [email protected]
> >> For additional commands, e-mail: [email protected]
> >>
> >>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to