Hello,

I have been playing around with JCC to see if it would provide in the needs we have here at work to interface Java with Python. I have encountered one issue in which I hope someone on this mailinglist might be able to help me with. If this is not the right place to ask then I apologize in advance.

This issue I am having is that I would like to create two packages compiled with JCC in which classes from one package are used by classes in the other pacakge. I would like to use those classes in Python but am having problems doing so that I don't understand yet.

In package 1 is the class shown below:

package nl.seecr.freestyle;

public class Sum {
    private int _sum;

    public Sum() {
        _sum = 0;
    }

    public void add(int value) {
        _sum += value;
    }

    public int value() {
        return _sum;
    }
}

The second package holds a class what uses the Sum Class:

package org.cq2.freestyle;

import nl.seecr.freestyle.Sum;

public class SumWrapper {

    private Sum total;

    public SumWrapper() {
        this(new Sum());
        System.out.println("Empty constructor");
    }

    public SumWrapper(Sum sum) {
        total = sum;
    }

    public void add(int value) {
        total.add(value);
    }

    public int value() {
        return total.value();
    }

    public Sum asSum() {
        Sum sum = new Sum();
        sum.add(value());
        return sum;
    }

    public void printValue() {
        System.out.println(value());
    }
}

I can compile these classes into .class files and put them in jars and have those compiled with JCC:
python -m jcc \
    --root ${ROOT} \
    --use_full_names \
    --shared \
    --arch x86_64 \
    --jar cq2.jar \
    --classpath ./seecr.jar \
    --python cq2 \
    --build \
    --install

export PYTHON_PATH=${ROOT}/usr/local/lib/python2.7/dist-packages
python -m jcc \
    --root ${ROOT} \
    --use_full_names \
    --import cq2 \
    --shared \
    --arch x86_64 \
    --jar seecr.jar \
    --python seecr \
    --build \
    --install

In my understanding the "--import cq2" argument should prevent jcc from creating a wrapper for the Sum class in the seecr package itself but use the one in the cq2 package.

This all compiles without errors but when I run the following python program:

import seecr
seecr.initVM()

import cq2
cq2.initVM()

from nl.seecr.freestyle import Sum
from org.cq2.freestyle import SumWrapper

sum = Sum()
sum.add(5)
print "Sum value", sum.value()

wrapper = SumWrapper(sum)
print wrapper.value()

The 1st print shows the value 5 as expected. The 2nd print however shows 0 and I had not expected that. If I run the same program in Java and use the jars I created earlier, the 2nd print shows 5 (as expected). The "Empty constructor" message is also shown when running this python program and I had not expected that to happen.

The "asSum" method in the SumWrapper class is not available in the Python version of the class. I do not understand yet why that is.

I haven't been able to find many examples or documentation on the options for compiling with JCC. I am hoping that someone here on the mailinglist can point me in the right direction. Any help would be really appreciated.


Johan

Reply via email to