//getting the in/inout parameters
Iterator ports = this.portList().iterator();
Vector args = new Vector();
while (ports.hasNext()) {
TypedIOPort port = (TypedIOPort) ports.next();
if (port.isInput() && port.hasToken(0)
&& !(port.isOutput() && !port.isInput())) {
Token tok = port.get(0);
String typ = _methods[_methodIndex].getParameterTypes()[args
.size()].toString();
if (typ.equals("boolean")) {
args.add(Boolean.valueOf(((BooleanToken) tok)
.booleanValue()));
} else if (typ.equals("int")) {
args.add(Integer.valueOf(((IntToken) tok).intValue()));
} else if (typ.equals("double")) {
args.add(Double.valueOf(((DoubleToken) tok).doubleValue()));
} else if (typ.equals("class [I")) {
int siz = ((ArrayToken) tok).arrayValue().length;
int[] tab = new int[siz];
for (int j = 0; j < siz; j++) {
tab[j] = ((IntToken) (((ArrayToken) tok).arrayValue()[j]))
.intValue();
}
//(int[])((ArrayToken)tok).arrayValue();
args.add(tab);
} else {
System.out.println("The intype is not convertible "
+ "with Ptolemy II types.");
}
}
}
//tBFixed : the out parameter is not in by definition
//...so no port in can initialize the param
//call the native function
Object obj = null;
Object ret = null;
try {
try {
obj = _class.newInstance();
} catch (Error error) {
// Using JNI to link in a native library
// can result in a java.lang.UnsatisfiedLinkError
// which extends Error, not Exception.
// FIXME: Rethrow the error as an exception
String libraryPath = StringUtilities
.getProperty("java.library.path");
throw new Exception("Class '" + _class
+ "' cannot be instantiated.\n"
+ "If you are running under Windows, "
+ "be sure that the directory containing the library "
+ "is in your PATH.\n"
+ "If you are running under Solaris, "
+ "be sure that the directory containing the library "
+ "is in your LD_LIBRARY_PATH and that the library "
+ "name begin with 'lib' and end with '.so'.\n"
+ "You may need to exit, set your "
+ "PATH or LD_LIBRARY_PATH to include the directory "
+ "that contains the shared library and "
+ "restart.\n" + "For example, under Windows "
+ "in a Cygwin bash shell:\n"
+ "PATH=/cygdrive/c/ptII/jni/dll:${PATH}\n"
+ "export PATH\n" + "vergil -jni foo.xml\n"
+ "A common error is that "
+ "the class cannot be found in "
+ "property 'java.library.path' " + "which is:\n"
+ libraryPath + "\nError message was: "
+ error.getMessage(), error);
}
} catch (Exception ex) {
throw new IllegalActionException(this, ex,
"Class cannot be instantiated");
}
try {
ret = _methods[_methodIndex].invoke(obj, args.toArray());
} catch (Throwable ex) {
StringBuffer argumentsDescription = new StringBuffer("");
try {
if (args.size() >= 1) {
argumentsDescription.append(args.elementAt(0).toString());
for (int i = 1; i < args.size(); i++) {
argumentsDescription.append(", "
+ args.elementAt(i).toString());
}
}
} catch (Throwable throwable) {
// Ignore
}
throw new IllegalActionException(this, ex,
"Native operation call failed." + "Failed to invoke '"
+ obj + "' with " + args.size() + " arg(s) "
+ argumentsDescription.toString());
}
ports = portList().iterator();
while (ports.hasNext()) {
TypedIOPort port = (TypedIOPort) ports.next();
//if the argument is return
if (getArgumentReturn() == null) {
System.err.println("Warning: GenericJNIActor.java: "
+ "getArgumentReturn() returns null?");
}
if ((port != null)
&& (port.getName() != null)
&& (getArgumentReturn() != null)
&& port.getName()
.equals(this.getArgumentReturn().getName())) {
String typ = "";
Field field = null;
try {
field = _class.getDeclaredField("_" + port.getName());
typ = field.getType().toString();
} catch (NoSuchFieldException e) {
try {
throw new IllegalActionException(this, e,
"No return type field '_" + port.getName()
+ "'");
} catch (Throwable throwable) {
getDirector().stop();
}
}
if (typ.equals("boolean")) {
port.send(0, new BooleanToken(((Boolean) ret)
.booleanValue()));
} else if (typ.equals("double")) {
port.send(0, new DoubleToken(((Double) ret).doubleValue()));
} else if (typ.equals("int")) {
port.send(0, new IntToken(((Integer) ret).intValue()));
} else if (typ.equals("char")) {
port.send(0,
new UnsignedByteToken(((Byte) ret).byteValue()));
} else {
System.out.println("The return type is not convertible "
+ "with Ptolemy II types.");
}
}
//if the argument is output
else if ((port != null)
&& port.isOutput()
&& (port.getName() != null)
&& (getArgumentReturn() != null)
&& !(port.getName().equals(this.getArgumentReturn()
.getName()))) {
String typ = "";
Field field = null;
try {
field = _class.getDeclaredField("_" + port.getName());
typ = field.getType().toString();
} catch (NoSuchFieldException ex) {
try {
field = _class.getDeclaredField("_"
+ port.getName().substring(0,
port.getName().length() - 3));
typ = field.getType().toString();
} catch (Throwable throwable) {
try {
throw new IllegalActionException(this, throwable,
"No '+" + port.getName() + "' field !");
} catch (Throwable throwable2) {
getDirector().stop();
}
}
}
if (field == null) {
throw new InternalErrorException("Field '" + port.getName()
+ "' in '" + _class + "' is null?");
} else {
if (typ.equals("boolean")) {
try {
port.send(0,
new BooleanToken(field.getBoolean(obj)));
} catch (IllegalAccessException ex) {
throw new IllegalActionException(this, ex, "Type '"
+ typ + "' is not castable");
}
} else if (typ.equals("double")) {
try {
port.send(0, new DoubleToken(field.getDouble(obj)));
} catch (IllegalAccessException ex) {
throw new IllegalActionException(this, ex, "Type '"
+ typ + "' is not castable");
}
} else if (typ.equals("int")) {
try {
port.send(0, new IntToken(field.getInt(obj)));
} catch (IllegalAccessException ex) {
throw new IllegalActionException(this, ex, "Type '"
+ typ + "' is not castable");
}
} else if (typ.equals("char")) {
try {
port.send(0, new UnsignedByteToken(field
.getChar(obj)));
} catch (IllegalAccessException ex) {
throw new IllegalActionException(this, ex, "Type '"
+ typ + "' is not castable");
}
} else if (typ.equals("class [I")) {
try {
if (field == null) {
throw new InternalErrorException(
"field == null?");
}
if (obj == null) {
throw new InternalErrorException("obj == null?");
}
if (field.get(obj) == null) {
throw new InternalErrorException(
"field.get(obj) == null? (field = "
+ field + " obj = " + obj);
}
Token[] toks = new Token[((int[]) field.get(obj)).length];
for (int j = 0; j < ((int[]) field.get(obj)).length; j++) {
toks[j] = new IntToken(
((int[]) field.get(obj))[j]);
}
port.send(0, new ArrayToken(BaseType.INT, toks));
} catch (IllegalAccessException ex) {
throw new IllegalActionException(this, ex, "Type '"
+ typ + "' is not castable");
}
} else if (typ.equals("class [D")) {
try {
Token[] toks = new Token[((double[]) field.get(obj)).length];
for (int j = 0; j < ((double[]) field.get(obj)).length; j++) {
toks[j] = new DoubleToken(((double[]) field
.get(obj))[j]);
}
port.send(0, new ArrayToken(toks));
} catch (IllegalAccessException ex) {
throw new IllegalActionException(this, ex, "Type '"
+ typ + "' is not castable");
}
} else {