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