I just discovered something that is worth to be noted:
MacOSX supports both jnilib and dylib as native libraries.
And when you indicate in Maven Bundle Plugin configuration:
<Bundle-NativeCode>
lib/libHelloWorld.dylib;
lib/libHelloWorld.jnilib;
osname=MacOSX
</Bundle-NativeCode>
It includes both dylib and jnilib in the jar.
However, when the bundle is loaded, Equinox only extracts the jnilib from the
jar (it can be found in
$EQUINOX_HOME/configuration/org.eclipse.osgi/bundles/1/1/.cp/lib/), and not the
dylilb.
This is why you had to use the jnilib extension 6 month ago. It's not an OSX
related issue, but the way Equinox extracts the native librairies from the jar.
I did not check with Felix and thus don't know if the behaviour is the same.
Ben
Le 12 oct. 2010 à 12:30, Derek Baum a écrit :
> I doubt this problem is related to iPOJO, but it may be worth factoring this
> out of the equation by testing with a BundleActivator instead of iPOJO. It
> may still fail, but you may get a more meaningful exception.
>
> I created a Mac native bundle about 6 months ago, and was caught out by the
> .jnilib extension, which was required on OSX 10.6.3.
>
> Derek
>
>
> 2010/10/12 Thiébault Benoît <[email protected]>
>
>> 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]
>>
>>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]