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]

Reply via email to