I tried.
Still got the same error.
Ben
Le 12 oct. 2010 à 14:44, Derek Baum a écrit :
> Try putting System.loadLibrary() in a static block, rather than in the
> start() method.
>
> public class HelloWorld {
> static {
> System.loadLibrary("HelloWorld");
> }
> ...
> }
>
> Derek
>
>
> 2010/10/12 Thiébault Benoît <[email protected]>
>
>> This is definitely an iPOJO problem: I just used an OSGi BundleActivator
>> and it works...
>>
>> 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]
>>
>>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]