On Fri, 4 Mar 2011, Bill Janssen wrote:

Andi Vajda <va...@apache.org> wrote:

Something's off. libjcc.so is not shown in your list.
You need to solve that mystery before embedding can proceed.

So, I went to my Mac, and looked for libjcc.dylib.  Sure enough,
it's there.  So I tried this simple program:

import org.apache.jcc.PythonVM;

public class test {

   public static void main (String[] argv) {
       PythonVM.start("/usr/bin/python",
            new String[] { "-c", "import time; print time.localtime()"});
   }
}

It seems that you think that this is going to run /usr/bin/python.
Not really. The dynamic linker is going to load whatever libpython.dylib JCC was linked with, provided it knows to do that (see below), then JCC is going to call
   Py_SetProgramName("/usr/bin/python") and
   PySys_SetArgv({"/usr/bin/python", "-c", "import time; print 
time.localtime()")
This is done in jcc.cpp, in the _PythonVM_init() function.

No python code is going to be executed until you actually call instantiate() with a python module and class name. These argv things are just stuffed into sys.argv, not interpreted or anything.

Here's what happens:

See below...

% javac -classpath 
/Library/Python/2.5/site-packages/JCC-2.6-py2.5-macosx-10.5-i386.egg/jcc/classes:.
 test.java
% java 
-Djava.library.path=/Library/Python/2.5/site-packages/JCC-2.6-py2.5-macosx-10.5-i386.egg
 -classpath 
/Library/Python/2.5/site-packages/JCC-2.6-py2.5-macosx-10.5-i386.egg/jcc/classes:.
 test
Exception in thread "main" java.lang.UnsatisfiedLinkError: 
/Library/Python/2.5/site-packages/JCC-2.6-py2.5-macosx-10.5-i386.egg/libjcc.dylib:  
Symbol not found: __Py_NoneStruct   Referenced from: 
/Library/Python/2.5/site-packages/JCC-2.6-py2.5-macosx-10.5-i386.egg/libjcc.dylib   
Expected in: dynamic lookup
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1824)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1748)
        at java.lang.Runtime.loadLibrary0(Runtime.java:822)
        at java.lang.System.loadLibrary(System.java:993)
        at org.apache.jcc.PythonVM.<clinit>(PythonVM.java:23)
        at test.main(test.java:6)
% otool -L 
/Library/Python/2.5/site-packages/JCC-2.6-py2.5-macosx-10.5-i386.egg/libjcc.dylib
/Library/Python/2.5/site-packages/JCC-2.6-py2.5-macosx-10.5-i386.egg/libjcc.dylib:
        @rpath/libjcc.dylib (compatibility version 2.6.0, current version 2.6.0)
        /System/Library/Frameworks/JavaVM.framework/Versions/A/JavaVM 
(compatibility version 1.0.0, current version 1.0.0)
        /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current 
version 7.4.0)
        /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 
1.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current 
version 111.1.5)

Notice how libpython.dylib (or whatever its correct name is) is not listed here. This means that JCC was built to expect the main process to provide libpython.dylib to the dynamic linker which works in the usual - starting in a python process - case.

To fix that, to help the dynamic linker to load that library, you need to change the LFLAGS for 'darwin' in JCC's setup.py to also list the python framework by adding '-framework', 'Python' to that list. After rebuilding JCC, be sure then that otool lists libpython.dylib to verify that it worked.

Andi..

Reply via email to