Try putting System.loadLibrary() in a static block, rather than in the
start() method.

public class HelloWorld {
   static {
     System.loadLibrary("HelloWorld");
  }
...
}

Derek


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

> This is definitely an iPOJO problem: I just used an OSGi BundleActivator
> and it works...
>
> Ben
>
> Le 12 oct. 2010 à 12:30, Derek Baum a écrit :
>
> > 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]
> >>
> >>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to