Hi all.
I have a new patch that adds support for loading of
TclBlend into a Java, it is a little less complex
than the solution Jiang proposed.
Here is the source file I am using.
% cat LoadTclBlend.java
import tcl.lang.*;
public class LoadTclBlend {
public static void main(String[] args) throws Exception {
Interp i = new Interp();
i.setVar("i", "1", 0);
i.eval("puts \"i is $i\"");
i.eval("package require java");
i.eval("set str [java::new String \"I am a Java String\"]");
i.eval("puts [$str toString]");
}
}
Here are the results with IBM JDK 1.3.
% java LoadTclBlend
i is 1
I am a Java String
Here is the patch I used:
Index: src/native/java.h
===================================================================
RCS file: /home/cvs/external/tcljava/src/native/java.h,v
retrieving revision 1.6
diff -u -r1.6 java.h
--- java.h 2000/06/15 09:47:06 1.6
+++ java.h 2000/06/15 13:37:18
@@ -133,7 +133,9 @@
jmethodID invokeTimer;
} JavaInfo;
+/* These are defined in javaCmd.c */
extern JavaInfo java;
+extern JNIEnv *currentEnv;
/*
* The following macros are used to enter and leave the global
Index: src/native/javaCmd.c
===================================================================
RCS file: /home/cvs/external/tcljava/src/native/javaCmd.c,v
retrieving revision 1.9
diff -u -r1.9 javaCmd.c
--- javaCmd.c 2000/06/15 09:47:06 1.9
+++ javaCmd.c 2000/06/15 13:37:18
@@ -62,7 +62,7 @@
* will contain the environment for the default thread.
*/
-static JNIEnv *currentEnv = NULL; /* JNI pointer for current thread. */
+JNIEnv *currentEnv = NULL; /* JNI pointer for current thread. */
/*
* The following variable contains the pointer to the current Java VM,
Index: src/native/javaInterp.c
===================================================================
RCS file: /home/cvs/external/tcljava/src/native/javaInterp.c,v
retrieving revision 1.6
diff -u -r1.6 javaInterp.c
--- javaInterp.c 2000/06/15 09:47:07 1.6
+++ javaInterp.c 2000/06/15 13:37:19
@@ -101,8 +101,11 @@
jlong lvalue;
Tcl_Interp *interp;
JNIEnv *oldEnv;
+ int loadedFromJava = (currentEnv == NULL); /* true if Tcl Blend was
loaded into Java */
- PUSH_JAVA_ENV();
+ if (! loadedFromJava) {
+ PUSH_JAVA_ENV();
+ }
interp = Tcl_CreateInterp();
if (JavaSetupJava(env, interp) != TCL_OK) {
@@ -116,7 +119,9 @@
*(Tcl_Interp**)&lvalue = interp;
}
- POP_JAVA_ENV();
+ if (! loadedFromJava) {
+ POP_JAVA_ENV();
+ }
return lvalue;
}
What do you think? We still need to solve some other deadlocking
problems, but at least it loads without a SIGSEGV now :)
Mo Dejong
Red Hat Inc.
----------------------------------------------------------------
The TclJava mailing list is sponsored by Scriptics Corporation.
To subscribe: send mail to [EMAIL PROTECTED]
with the word SUBSCRIBE as the subject.
To unsubscribe: send mail to [EMAIL PROTECTED]
with the word UNSUBSCRIBE as the subject.
To send to the list, send email to '[EMAIL PROTECTED]'.
An archive is available at http://www.mail-archive.com/[email protected]