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]

