From: Stanford, E. R. <Edw...@it...> - 2010-06-07 14:51:05
|
I am having trouble accessing inherited C++ class members in a C++ library (but not regular class members) via SWIG from Java. I am using SWING 1.3.40, and have reduced my problem to the following test case: C++ .h files Parent.h class Parent { public: Parent(): str("parent") {}; virtual ~Parent(); std::string get() { return str; } private: std::string str; }; Child.h class Child : public Parent { public: Child(): bar("child") {}; virtual ~Child(); std::string getBar() { return bar; } private: std::string bar; }; Thus, on the C++ side I can make a call to get() from an instance of Child and get the std::string "bar", or a call to getBar() and get the std::string "dang It". I wish to achieve similar functionality in Java. I generate the proxy classes via the following SWIG command: swig -Wall -c++ -java -package com.itt.cudadif -outdir com/itt/cudadif -module cudadif cudadif.i using the following interface file: %module cudadif %include "arrays_java.i"; %include std_string.i %ignore *::operator+=; %ignore *::operator=; %ignore *::operator+; %ignore *::operator!=; %ignore *::operator==; %{ #include "Parent.h" #include "Child.h" %} %include ../cushark/DeviceBenchmark.h %include ../cushark/CudaMetaData.h %include Parent.h %include Child.h Shared objects and proxy classes are duly generated. When I attempt to use the resulting classes from java 1.6.0_20, I use the following test driver: import com.itt.cudadif.Parent; import com.itt.cudadif.Child; public class Driver { public static void main(String argv[]) { System.loadLibrary("cudadifjni"); Parent ts = new Parent(); String ss = ts.get(); System.err.println(ss); Child us = new Child(); System.err.println("Should work " + us.getBar()); System.err.println("Child calls parent"); System.err.println(us.get()); } The result compiles, and runs properly until the last line, as can be seen from the following output: parent Should work child Child calls parent # # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x00007fd878b68778, pid=6085, tid=140568964585744 # # JRE version: 6.0_20-b02 # Java VM: Java HotSpot(TM) 64-Bit Server VM (16.3-b01 mixed mode linux-amd64 ) # Problematic frame: # C [libstdc++.so.6+0xa6778] _ZNSsC1ERKSs+0x8 I appear to be able to access get() from an instance of Parent, but not the get() method an instance of Child should inherit. If it matters, I am on Ubuntu 9.10, running gcc 4.3.4. Any suggestions would be most welcome. Edward This e-mail and any files transmitted with it may be proprietary and are intended solely for the use of the individual or entity to whom they are addressed. If you have received this e-mail in error please notify the sender. Please note that any views or opinions presented in this e-mail are solely those of the author and do not necessarily represent those of ITT Corporation. The recipient should check this e-mail and any attachments for the presence of viruses. ITT accepts no liability for any damage caused by any virus transmitted by this e-mail. |