Hello,
i made a little HelloWorld C++ executable to popup a Java HelloWolrd
GUI, but it gives a core dump.
My environment:
------------
- Pentium Linux 2.0.36 with glibc
- Motif 2.0.1 (shared library)
- jdk1.2pre-v1.tar from Blackdown
The output: (after invoking the C++ executable HelloWorldAwt)
------------------------------------------------
....
[Loaded sun.awt.NativeLibLoader from
/usr/local/jdk1.2Pre1/jre/lib/rt.jar]
[Dynamic-linking native method sun/awt/PlatformFont.initIDs ... JNI]
[Loaded sun.awt.PlatformFont$1 from
/usr/local/jdk1.2Pre1/jre/lib/rt.jar]
<GC: managing allocation failure: need 1032 bytes, type=1, action=1>
....
[Dynamic-linking native method sun/awt/FontDescriptor.initIDs ... JNI]
[Loaded sun.awt.motif.CharToByteX11Dingbats from
/usr/local/jdk1.2Pre1/jre/lib/rt.jar]
[Loaded sun.awt.CharToByteSymbol from
/usr/local/jdk1.2Pre1/jre/lib/rt.jar]
SIGSEGV 11* segmentation violation
stackpointer=0xbfffeba0
Full thread dump Classic VM (Linux_JDK_1.2_pre-release-v1, native
threads):
"AWT-Motif" (TID:0x412c11a8, sys_thread_t:0x81be900, state:MW,
native ID:0x1806) prio=5
at sun.awt.motif.MToolkit.run(Native Method)
at java.lang.Thread.run(Thread.java:479)
"SunToolkit.PostEventQueue-0" (TID:0x412c1010,
sys_thread_t:0x81a2c30, state:CW, native ID:0x1405) prio=5
at java.lang.Object.wait(Native Method)
....
How to reproduce:
-------------
There are 3 little files attached:
HelloWorldAwt.C The C++ executable
HelloWorldAwt.java The AWT Gui Popup window
Makefile How i compile the stuff.
Question:
-------
Did anybody try this before?
Which Motif version do I need?
Thanks for any hints,
Marcel
PS: The code seems to be more or less correct, since i just run it on
Windows NT successfully
/*
HelloWorldAwt.C
*/
#include <jni.h>
#include <iostream>
using namespace std;
bool done = false;
int main()
{
const int nOpts = 4;
JavaVMOption options[nOpts];
int ii=0;
options[ii++].optionString = "-Djava.compiler=NONE"; /* disable JIT
*/
options[ii++].optionString = "-Djava.class.path=."; /* user classes
*/
options[ii++].optionString = "-Djava.library.path=."; /* set native
library path */
options[ii++].optionString = "-verbose:jni,class,gc"; /* print
JNI-related messages */
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_2;
vm_args.options = options;
vm_args.nOptions = nOpts;
vm_args.ignoreUnrecognized = JNI_TRUE;
JavaVM *jvm;
JNIEnv *env;
jint res = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
if (res < 0) { cerr << "Can't create Java VM" << endl; exit(1); }
cout << "JNI_CreateJavaVM() is OK" << endl;
jclass cls = env->FindClass("HelloWorldAwt");
if (cls == 0) { cerr << "Can't find HelloWorldAwt class" << endl; exit(1); }
jmethodID cons = env->GetMethodID(cls, "<init>", "()V"); // Constructor
if (cons == 0) { cerr << "Constructor ERROR" << endl; exit(1); }
jobject obj = env->NewObject(cls, cons);
if (obj == 0) { cerr << "NewObject ERROR" << endl; exit(1); }
cout << "HelloWorldAwt.C: Entering forever loop ..." << endl;
while (!done) { }
cout << "HelloWorldAwt.C: Good bye ..." << endl;
jvm->DestroyJavaVM();
return 0;
}
#JDK_HOME=/usr/local/jdk
MY_JAVAC = javac
MY_INCLUDE = -I$(JDK_HOME)/include -I$(JDK_HOME)/include/linux
MY_JAVA_LIBS= -L$(JDK_HOME)/jre/lib/i386 -ljava -lawt -L
$(JDK_HOME)/jre/lib/i386/native_threads -lhpi -L$(JDK_HOME)/jre/lib/i386/classic -ljvm
MY_X_LIBS = -L/usr/X11R6/lib -lXm -lXpm -lXt -lSM -lICE -lXext -lX11
HelloWorldAwt.class : HelloWorldAwt.java
$(MY_JAVAC) HelloWorldAwt.java
@echo "-> HelloWorldAwt.class done"
@echo ""
HelloWorldAwt.h : HelloWorldAwt.java
javah -jni HelloWorldAwt
@echo "-> HelloWorldAwt.h done"
@echo ""
HelloWorldAwt : HelloWorldAwt.class HelloWorldAwt.h HelloWorldAwt.C
g++ -D_REENTRANT $(MY_INCLUDE) $(MY_JAVA_LIBS) $(MY_X_LIBS) HelloWorldAwt.C -o
HelloWorldAwt
@echo "-> HelloWorldAwt (C++ executable) done"
@echo ""
all: usage HelloWorldAwt
@echo "######### Starting C++ application with Awt GUI ... ########"
HelloWorldAwt
@echo ""
clean:
rm -f *.class *.so
rm -f HelloWorldAwt
rm -f HelloWorldAwt.h
usage:
@echo "---------------------------------------------------------"
@echo "CAUTION: Set this environment before using the Makefile! "
@echo "export
LD_LIBRARY_PATH=.:$(JDK_HOME)/jre/lib/i386:$(JDK_HOME)/jre/lib/i386/native_threads:$(JDK_HOME)/jre/lib/i386/classic"
@echo "export LD_BIND_NOW=true"
@echo "export RTLD_NOW=true"
@echo "export LD_PRELOAD=libpthread.so"
@echo "---------------------------------------------------------"
/*
HelloWorldAwt.java
*/
import java.awt.*;
import java.awt.event.*;
public class HelloWorldAwt extends Frame
{
Toolkit toolkit = Toolkit.getDefaultToolkit();
Button beepButton;
private String myName = "HelloWorldAwt.java: ";
public HelloWorldAwt()
{
System.out.println(myName + "Entering constuctor ...");
setTitle("My little JNI-JDK-2 test");
init();
setSize(400, 200);
show();
System.out.println(myName + "Leaving constuctor ...");
}
public void init()
{
System.out.println(myName + "Entering init() ...");
beepButton = new Button("Hi you - Beep me :-)");
class BeepListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println(myName + "Entering
actionPerformed() ...");
toolkit.beep();
}
}
beepButton.addActionListener(new BeepListener());
setLayout(new FlowLayout());
add(beepButton);
}
/**
Use this for testing the java AWT <br>
java HelloWorldAwt
*/
static public void main(String[] args)
{
HelloWorldAwt aa = new HelloWorldAwt();
//aa.showWindow();
}
}