B19 dll with JNI causing Dr. Watson to drop by...

Andrew Mickish mickish@cmu.edu
Mon Oct 19 07:00:00 GMT 1998


> 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: 1998年6月11日 19:48:11 -0400
 From: Andrew Mickish <mickish@CMU.EDU>
 To: gnu-win32@cygnus.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@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@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@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@cmu.edu
-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request@cygnus.com" with one line of text: "help".


More information about the Cygwin mailing list

AltStyle によって変換されたページ (->オリジナル) /