I've tried added the Sum class to the 2nd JCC call but it didn't solve the problem. The 'asSum' method isn't getting wrapped. Also, instantiating a SumWrapper with a Sum as argument results in the constructor without parameters being called; which I wasn't expecting.

>>> c=SumWrapper(Sum(10))
Empty constructor
>>>

I tried compiling everything into one file and then I do get the asSum method wrapped but the constructor with a Sum as argument doesn't seem to work still. It doesn't call the empty constructor anymore but neither does it seem to set Sum object passed to it. I am a bit at a loss here on whats going wrong (or what I am doing wrong).

Any thoughts on this problem would be appreciated :-)

Regards,

Johan

On 7/1/13 8:00 PM, Andi Vajda wrote:

On Mon, 1 Jul 2013, Johan Jonkers wrote:

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.

I haven't had time yet to reproduce the problem but you may want to try to add an explicit request to wrap the Sum class - by just listing it on the second jcc call command line. No wrapper will be generated for it, because of the --import statement, but methods in the second jar with Sum in their signature should then get wrapped.

python -m jcc \
--root ${ROOT} \
--use_full_names \
--import cq2 \
--shared \
--arch x86_64 \
--jar seecr.jar \
--python seecr \
--build \
--install \
nl.seecr.freestyle.Sum

Andi..


--
Johan Jonkers ♦ seecr.nl ♦ +31 (0) 655 734 175

Reply via email to