[vtkusers] Coding Errors in VTK Java

Jeff Lee jeff at cdnorthamerica.com
Tue May 21 16:05:39 EDT 2002


Dale,
One problem is with SetDataTypeToDouble.  Comment that out and you'll 
get better results.  The implementation for the wrapper languages 
assumes doubles for vtkPoints.  

1) points.GetPoint(slotID, p); -- doesn't work but should (jni isn't 
modifying p the right way)
2) p = points.GetPoint(slotID);  -- works as expected

The problem with 1) is in the JNI wrappers and can be fixed by the 
following modification:
(in vtkPointsJava.cxx)

extern "C" JNIEXPORT void  JNICALL 
Java_vtk_vtkPoints_GetPoint_127(JNIEnv *env, jobject obj,jint 
id0,jdoubleArray id1)
{
  vtkPoints *op;
  long     temp0;
  float  temp1[3];
  void *tempArray1;
  temp0 = id0;
  jboolean isCopy;
  tempArray1 = (void *)(env->GetDoubleArrayElements(id1,&isCopy));
  temp1[0] = ((jdouble *)tempArray1)[0];
  temp1[1] = ((jdouble *)tempArray1)[1];
  temp1[2] = ((jdouble *)tempArray1)[2];

  if (isCopy == JNI_TRUE) {
    env->ReleaseDoubleArrayElements(id1,(jdouble *)tempArray1,0);
  }

  op = (vtkPoints *)vtkJavaGetPointerFromObject(env,obj,(char *) 
"vtkPoints");
  op->GetPoint(temp0,temp1);
}

The key difference is the boolean isCopy which lets us know if the 
memory pointed to by env->GetDoubleArrayElements(id1,&isCopy) will be 
pinned or not.  I will try to work this into the wrapper when I get time.

-Jeff

Dale Greer wrote:

>Here's a simple class for testing vtkPoints.GetPoint(). It's only using one
>point, but it behaves the same as my larger app that uses an array of
>points.
>
>import vtk.*;
>
>import java.io.*;
>
>public class TestGetPoint {
> static {
>  System.loadLibrary("vtkCommonJava");
>  System.loadLibrary("vtkFilteringJava");
>  System.loadLibrary("vtkIOJava");
>  System.loadLibrary("vtkImagingJava");
>  System.loadLibrary("vtkGraphicsJava");
>  System.loadLibrary("vtkRenderingJava");
> }
>
> public TestGetPoint() {
> }
> public void testing() {
>  vtkPoints points = new vtkPoints();
>  points.SetDataTypeToDouble();
>  int slotID = 0;
>  double[] p = new double[3];
>  p[0] = 1.1;
>  p[1] = 2.2;
>  p[2] = 3.3;
>  slotID = points.InsertNextPoint(p);
>  p[0] = 0;
>  p[1] = 0;
>  p[2] = 0;
>  points.GetPoint(slotID, p);
>  System.out.println("p1 " + slotID + " " + p[0] + " " + p[1] + " " + p[2]);
>  p = points.GetPoint(slotID);
>  System.out.println("p2 " + slotID + " " + p[0] + " " + p[1] + " " + p[2]);
> }
> public static void main(String[] args) {
>  TestGetPoint tester = new TestGetPoint ();
>  tester.testing();
> }
>}
>
>This is the output.
>
>p1 0 0.0 0.0 0.0
>p2 0 1.100000023841858 1.056176589181958E-38 1.2611686178923354E-44
>
>In p1, p is unchanged because Java can't modify an object using a pointer
>reference. Java can only pass back objects on the stack.
>In p2, the first element is returned correctly. I think this is because Java
>doubles only add bytes to the mantissa and don't change the exponent, so you
>can overlay a float on top of a double structure, and it will be read the
>same. But the other two elements of p are incorrect because the bytes are no
>longer aligned on the stack. Java is popping three doubles off a stack that
>only has three floats. Of course, Java won't let you cast it to a float
>pointer, so you're stuck.
>
>Dale
>
>----- Original Message -----
>From: "Jeff Lee" <jeff at cdnorthamerica.com>
>To: "Dale Greer" <dmgreer at airmail.net>
>Cc: <vtkusers at public.kitware.com>
>Sent: Tuesday, May 21, 2002 5:14 AM
>Subject: Re: [vtkusers] Coding Errors in VTK Java
>
>
>>Dale,
>>Do you have some sample code that exhibits the problem?  I assure you
>>that what you have below is compeletly valid with jni.
>>-Jeff
>>
>>Dale Greer wrote:
>>
>>>There are some fatal coding errors in the Java interface to the vtk
>>>
>dll's.
>
>>>For example, in vtkPoints, there's a declaration for GetPoint which
>>>
>returns
>
>>>a pointer to a float on the stack. But in Java, GetPoint returns a
>>>
>reference
>
>>>to a double array. If GetPoint is used in Java, the first element in the
>>>double
>>>array is valid, but the other two are not.
>>>
>>>C++
>>>
>>>float* vtkPoints::GetPoint( vtkdType id)
>>>
>>>Java
>>>
>>> private native double[] GetPoint_26(int id0);
>>> public double[] GetPoint(int id0)
>>>   { return GetPoint_26(id0); }
>>>
>>>
>>>Even worse, the C++ way to get back an array of doubles is to pass by
>>>reference in the argument, which isn't possible in Java, but which is
>>>nevertheless attempted by the autogenerated Java interface to the dll.
>>>
>>>C++
>>>
>>>void vtkPoints::GetPoint( vtkIdType id, double x[3])
>>>
>>>Java
>>>
>>> private native void GetPoint_27(int id0,double id1[]);
>>> public void GetPoint(int id0,double id1[])
>>>   { GetPoint_27(id0,id1); }
>>>
>>>
>>>Having pinpointed the problem, I'm not sure if I know how to fix this. Is
>>>there someone else who could put a fix for this into the nightly build?
>>>
>>>Dale
>>>
>>>
>>>_______________________________________________
>>>This is the private VTK discussion list.
>>>Please keep messages on-topic. Check the FAQ at:
>>>
><http://public.kitware.com/cgi-bin/vtkfaq>
>
>>>Follow this link to subscribe/unsubscribe:
>>>http://public.kitware.com/mailman/listinfo/vtkusers
>>>
>>>
>>
>>_______________________________________________
>>This is the private VTK discussion list.
>>Please keep messages on-topic. Check the FAQ at:
>>
><http://public.kitware.com/cgi-bin/vtkfaq>
>
>>Follow this link to subscribe/unsubscribe:
>>http://public.kitware.com/mailman/listinfo/vtkusers
>>
>
>_______________________________________________
>This is the private VTK discussion list. 
>Please keep messages on-topic. Check the FAQ at: <http://public.kitware.com/cgi-bin/vtkfaq>
>Follow this link to subscribe/unsubscribe:
>http://public.kitware.com/mailman/listinfo/vtkusers
>
>

-- 
Jeff Lee jeff at cdnorthamerica.com
CD North America
21 Lafayette Street, Suite 230
Lebanon, NH 03766
Tel:    (603) 643-9993 ext. 109
Fax:    (603) 643-9994






More information about the vtkusers mailing list