Hi,
Could you send me your code or (better) a simplified version. We have code
using JNI and iPOJO but it's not integrated in the test suite (shame on me...).
It probably comes from an issue during the manipulation of the native methods.
Regards,
Clement
On 12.10.2010, at 14:51, Thiébault Benoît wrote:
> 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]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]