Mail Archives: cygwin/1998/10/19/21:29:47
> Kiyoko F. Aoki wrote:
>
> Hello all,
>
> This is my second message to the mailing list regarding a problem I've
> been trying to deal with for the past couple of weeks... I hope someone
> will be able to help out.
>
> I am using g++ version egcs-2.91.57 (1.1 release) on NT4 (SP3) to create a
> dll that is called from my Java program through JNI. My problem is that
> my Java app can call the C++ routine ok, but Dr. Watson pops up in the
> following cases:
>
> 1. Initializing anything with new or malloc
> 2. Calling another c++ routine that allocates any memory as in above
>
> I was told that perhaps I wasn't initializing my dll correctly? What
> would that entail?? I created the (relocatable) dll using the procedures
> from cygnus' home page... any suggestions would be greatly appreciated!
>
> Kiyoko
>
> ------------------------------------------------------------------------
> Kiyoko F. Aoki Research Assistant Academia Sinica
> ------------------------------------------------------------------------
>
Kiyoko,
It is significantly more difficult to produce JNI-friendly DLL's with gcc than
with VC++. I do not fully understand the issues involved, and I hope a future
generation of cygwin gcc addresses this usability issue.
Attached is the sequence of steps that I use to compile my JNI DLL's. I did a
quick search of my C++ source code and was surprised to find that indeed I do
not malloc or new any native memory, though I do make JNI malloc calls like
NewObject and NewStringUTF.
Hope this helps,
--Andrew Mickish
http://www.andrew.cmu.edu/~am2q/
_______________________ forwarded message _____________________
Subject: Java JNI with GNU-WIN32 gcc
Date: Thu, 11 Jun 1998 19:48:11 -0400
From: Andrew Mickish <mickish AT CMU DOT EDU>
To: gnu-win32 AT cygnus DOT com
With significant help from Bill Pringlemeir, I figured out how to compile
Sun's JNI tutorial HelloWorld example under GNU-WIN32 with gcc. I will keep a
ZIP file of the gcc-compatible code at
http://www.andrew.cmu.edu/~am2q/HelloWorld.zip for future reference.
Please add this information to the GNU-WIN32 documentation and FAQ. As of
version 19.1, it is significantly more complicated to compile a
Java-compatible DLL under gcc than under Microsoft Visual C++. Even printf()
does not work in a gcc-compiled DLL, even thoough it works fine with VC++.
Will this be changing with future releases of GNU-WIN32?
Here are a few hints for how to compile a trivial JNI-compaible DLL with gcc:
1) You need init.cc, an element of building relocatable DLLs
2) There is a complicated linking procedure involving ld and intermediate
files:
ld --base-file hello.base --dll -o hello.dll HelloWorldImp.o init.o
$(LIB) -e _dll_entry AT 12
dlltool --as=as --dllname hello.dll --def hello.def --base-file
hello.base --output-exp hello.exp
ld --base-file hello.base hello.exp --dll -o hello.dll HelloWorldImp.o
init.o $(LIB) -e _dll_entry AT 12
dlltool --as=as --dllname hello.dll --def hello.def --base-file
hello.base --output-exp hello.exp
ld hello.exp --dll -o hello.dll HelloWorldImp.o init.o $(LIB)
-e _dll_entry AT 12
3) Printf will not work here. Use a Windows dialog box or call back into
Java to invoke System.out.println():
void jprintf (JNIEnv *env, char* str) {
jstring jstr = (*env)->NewStringUTF(env, str);
jclass System_class = (*env)->FindClass(env, "java/lang/System");
jfieldID fid_out = (*env)->GetStaticFieldID(env, System_class, "out",
"Ljava/io/PrintStream;");
jobject out = (*env)->GetStaticObjectField(env, System_class, fid_out);
jclass PrintStream_class = (*env)->FindClass(env,
"java/io/PrintStream");
jmethodID mid_println = (*env)->GetMethodID(env, PrintStream_class,
"println", "(Ljava/lang/String;)V");
if (mid_println == 0) {
exit(1);
}
(*env)->CallVoidMethod(env, out, mid_println, jstr);
}
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *env, jobject obj)
{
(void)env; (void)obj;
MessageBoxA(NULL,"Hello Jupiter!", "Hello world!", 0);
jprintf(env, "Hello Uranus!\n");
return;
}
A collection of files that implement Sun's JNI HelloWorld example may be found
at http://www.andrew.cmu.edu/~am2q/HelloWorld.zip
--Andrew Mickish
mickish AT cmu DOT edu
-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request AT cygnus DOT com" with one line of text: "help".
- Raw text -