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] > >

