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

Reply via email to