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]