We are about to switch to a new forum software. Until then we have removed the registration on this forum.
Dear All,
I am trying to implement DLL calls in my code and am starting with the tutorial on the wiki. I copied and pasted the code from the wiki, and include it here:
DLL_test_1.pde
import org.xvolks.test.bug.*;
// ... the other imports ...
import org.xvolks.jnative.com.*;
void setup()
{
  JNative.setLoggingEnabled(true); // show what JNative is doing!
  try
  {
    int blah=org.xvolks.jnative.util.ANT_DLL.ANT_Init((byte)0,(short)57600); // Call the first native function. This initializes the USB radio via the manufacturer's DLL. >>>>>THIS IS THE LINE THAT FAILS<<<<<
    print(blah); // should return '1' upon success. This was easy so far!
  }
  catch (NativeException e) // traps in case anything naughty happens
  {
  e.printStackTrace();
  }
  catch (IllegalAccessException e)
  {
    e.printStackTrace();
  }
}
void draw()
{
 exit(); // I put this in to kill the program after compiling
}
ANT_DLL.java
package org.xvolks.jnative.util;
import processing.core.*;
import org.xvolks.test.bug.*;
// ... the other imports ...
import org.xvolks.jnative.com.*;
public class ANT_DLL extends PApplet
{
  public static final String DLL_NAME = "ANT_DLL.DLL";
  //Cache the JNative object between calls.
  private static JNative nANT_Init;  // Native-side function names
  private static JNative nANT_AssignResponseFunction; //one for each DLL function you will use...
  // The actual DLL export, most likely from API documentation / header file:
  // __declspec(dllexport) BOOL ANT_Init(UCHAR ucUSBDeviceNum, USHORT usBaudrate);
  // Java-side function name
  public static int ANT_Init(byte ucUSBDeviceNum, short usBaudrate) throws NativeException, IllegalAccessException 
  {
    if(nANT_Init == null) 
    {
      nANT_Init = new JNative(DLL_NAME, "_ANT_Init");  // The actual "decorated" name in the DLL
      //BOOL is in fact an INT
      nANT_Init.setRetVal(Type.INT);  // tell JNative's DLL what kind of return data to expect
    }
    nANT_Init.setParameter(0, ucUSBDeviceNum); // tell JNative's DLL what data to pass to the native function, in what order.
    nANT_Init.setParameter(1, usBaudrate);    // ...
    nANT_Init.invoke();  // Finally, execute the native function
    return nANT_Init.getRetValAsInt(); // get native call's return value
  }
}
When I compile, I get:
Cannot find class or type named "org.xvolks.jnative.util.ANT_DLL"
I know that this code should not fully run on my machine, as I have nothing called "ANT_DLL.DLL", but I would expect it to fail at a different point, preferably inside the .java file. I have tried running as Administrator, but that doesn't change anything.
I am running Processing 2.1.1 on Windows 7 64-bit.
What am I missing here? Where should this fail if the code compiled properly, but was missing the proper DLL? Is this a Processing 2.x vs 1.x issue?
Thanks for your help!
Answers
I closed out processing, re-opened the sketch, only to find the .java file was gone (!). I copied and pasted the above text back into ANT_DLL.java and now I get:
Processing doesn't handle packages, not even in .java files. You should compile with the real Java compiler.
Note that your ANT_DLL.java file should reside in a org/xvolks/jnative/util folder.
Or drop the package definition, if that's only for your own usage.