summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules/java/eval.hpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sca-cpp/trunk/modules/java/eval.hpp32
1 files changed, 24 insertions, 8 deletions
diff --git a/sca-cpp/trunk/modules/java/eval.hpp b/sca-cpp/trunk/modules/java/eval.hpp
index 741dda52ca..7da1f20a38 100644
--- a/sca-cpp/trunk/modules/java/eval.hpp
+++ b/sca-cpp/trunk/modules/java/eval.hpp
@@ -34,6 +34,15 @@ namespace tuscany {
namespace java {
/**
+ * Handle differences between various JNI APIs.
+ */
+#ifdef JAVA_HARMONY_VM
+#define JNI_VERSION JNI_VERSION_1_4
+#else
+#define JNI_VERSION JNI_VERSION_1_6
+#endif
+
+/**
* Represent a Java VM runtime.
*/
jobject JNICALL nativeInvoke(JNIEnv *env, jobject self, jobject proxy, jobject method, jobjectArray args);
@@ -49,7 +58,7 @@ public:
// Create a new JVM
JavaVMInitArgs args;
- args.version = JNI_VERSION_1_6;
+ args.version = JNI_VERSION;
args.ignoreUnrecognized = JNI_FALSE;
JavaVMOption options[3];
args.options = options;
@@ -58,7 +67,8 @@ public:
// Configure classpath
const char* envcp = getenv("CLASSPATH");
const string cp = string("-Djava.class.path=") + (envcp == NULL? "." : envcp);
- options[args.nOptions++].optionString = const_cast<char*>(c_str(cp));
+ options[args.nOptions].optionString = const_cast<char*>(c_str(cp));
+ options[args.nOptions++].extraInfo = NULL;
#ifdef WANT_MAINTAINER_MODE
// Enable assertions
@@ -68,22 +78,28 @@ public:
// Configure Java debugging
const char* jpdaopts = getenv("JPDA_OPTS");
if (jpdaopts != NULL) {
- options[args.nOptions++].optionString = const_cast<char*>(jpdaopts);
+ options[args.nOptions].optionString = const_cast<char*>(jpdaopts);
+ options[args.nOptions++].extraInfo = NULL;
} else {
const char* jpdaaddr = getenv("JPDA_ADDRESS");
if (jpdaaddr != NULL) {
const string jpda = string("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=") + jpdaaddr;
- options[args.nOptions++].optionString = const_cast<char*>(c_str(jpda));
+ options[args.nOptions].optionString = const_cast<char*>(c_str(jpda));
+ options[args.nOptions++].extraInfo = NULL;
}
}
// Create the JVM
+#ifdef JAVA_HARMONY_VM
+ JNI_CreateJavaVM(&jvm, &env, &args);
+#else
JNI_CreateJavaVM(&jvm, (void**)&env, &args);
+#endif
} else {
// Just point to existing JVM
- jvm->GetEnv((void**)&env, JNI_VERSION_1_6);
+ jvm->GetEnv((void**)&env, JNI_VERSION);
}
// Lookup System classes and methods
@@ -94,7 +110,7 @@ public:
booleanClass = env->FindClass("java/lang/Boolean");
stringClass = env->FindClass("java/lang/String");
objectArrayClass = env->FindClass("[Ljava/lang/Object;");
- iterableClass = env->FindClass("Ljava/lang/Iterable;");
+ iterableClass = env->FindClass("java/lang/Iterable");
classForName = env->GetStaticMethodID(classClass, "forName", "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;");
doubleValueOf = env->GetStaticMethodID(doubleClass, "valueOf", "(D)Ljava/lang/Double;");
doubleValue = env->GetMethodID(doubleClass, "doubleValue", "()D");
@@ -509,10 +525,10 @@ const failable<value> evalClass(const JavaRuntime& jr, const value& expr, const
const jmethodID fid = (jmethodID)(long)(double)cadr(func);
// Convert args to Java jvalues
- const jvalue *args = valuesToJvalues(jr, cddr(func), cdr<value>(expr));
+ const jvalue* args = valuesToJvalues(jr, cddr(func), cdr<value>(expr));
// Call the Java function
- const jobject result = jr.env->CallObjectMethodA(jc.obj, fid, args);
+ const jobject result = jr.env->CallObjectMethodA(jc.obj, fid, const_cast<jvalue*>(args));
if (result == NULL)
return mkfailure<value>(string("Function call failed: ") + car<value>(expr) + " : " + lastException(jr));