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]

