/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class JNI12 {
static boolean verbose = true; // set to true to get messages for each test
static boolean allTestPass = true;
public static native void setVerboseOff();
/* Declare native methods that will call the JNI 1.2 reflection functions */
/** Should the same Method that it is passed, but tests FromReflectedMethod
* and ToReflectedMethod. */
static native Method testReflectedMethods(Class cls, Method m);
/** Should the same Field that it is passed, but tests FromReflectedField
* and ToReflectedField. */
static native Field testReflectedFields(Class cls, Field m);
/** Make sure we get the same data by using a weak ref that we do by
* using a global ref. */
static native Object testGlobalCreationAndReturn(Method m);
static native int testGlobalPersistenceAndDestruction(Object m);
static native Object testWeakCreationAndReturn(Method m);
static native int testWeakPersistenceAndDestruction(Object m);
public void dummyFunc() { }
public int dummyFld;
public static void main(String[] args) throws NoSuchMethodException,
NoSuchFieldException {
System.loadLibrary("JNI12");
if (args.length != 0) {
if (args[0].equals("-quiet")) {
verbose = false;
setVerboseOff();
}
}
Object returnObj;
// Reflected Methods
Class<?> myClass = JNI12.class;
Method dummyM = myClass.getMethod("dummyFunc", new Class[0]);
returnObj = testReflectedMethods(myClass, dummyM);
checkTest(0, (returnObj.equals(dummyM)), "ReflectedMethods");
Field dummyF = myClass.getField("dummyFld");
returnObj = testReflectedFields(myClass, dummyF);
checkTest(0, (returnObj.equals(dummyF)), "ReflectedFields & NewLocalRef");
Object heldGlobal = testGlobalCreationAndReturn(dummyM);
if (heldGlobal == null) {
if (verbose)
System.err.println("testGlobalCreationAndReturn returned null!");
heldGlobal = new Object();
}
if (verbose) {
System.out.println("heldGlobal = " + heldGlobal.toString());
}
checkTest(0, (heldGlobal != null && heldGlobal.equals(dummyM)), "GlobalCreationAndReturn");
int rint = testGlobalPersistenceAndDestruction(heldGlobal);
checkTest(rint, true, "GlobalPersistenceAndDestruction");
Object heldWeak = testWeakCreationAndReturn(dummyM);
if (heldWeak == null) {
if (verbose)
System.err.println("testWeakCreationAndReturn returned null!");
heldWeak = new Object();
}
if (verbose) {
System.out.println("heldWeak = " + heldWeak.toString());
}
checkTest(0, (heldWeak != null && heldWeak.equals(dummyM)), "WeakCreationAndReturn");
rint = testWeakPersistenceAndDestruction(heldWeak);
checkTest(rint, true, "WeakPersistenceAndDestruction");
// Summarize
if (allTestPass)
System.out.println("PASS: JNI_12");
else
System.out.println("FAIL: JNI_12");
}
static void printVerbose(String str) {
if (verbose)
System.out.println(str);
}
static void checkTest(int returnValue, boolean postCheck, String testName) {
if (returnValue == 0 && postCheck) {
printVerbose("PASS: " + testName);
} else {
allTestPass = false;
printVerbose("FAIL: " + testName);
}
}
}