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

