[vtkusers] Coding Errors in VTK Java
Dale Greer
dmgreer at airmail.net
Tue May 21 18:10:10 EDT 2002
Yea! It worked. I thought I was being thorough to use SetDataTypeToDouble,
but taking that out fixed it.
Dale
----- Original Message -----
From: "Jeff Lee" <jeff at cdnorthamerica.com>
To: "Dale Greer" <dmgreer at airmail.net>
Cc: <vtkusers at public.kitware.com>; "Ken Martin" <ken.martin at kitware.com>
Sent: Tuesday, May 21, 2002 3:05 PM
Subject: Re: [vtkusers] Coding Errors in VTK Java
> 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
>
>
>
> _______________________________________________
> 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
More information about the vtkusers
mailing list