20. august 2003 - 02:31
Der er
22 kommentarer og 2 løsninger
Er der nogen der kender denne compileringsfejl?
Jeg faar denne fejl naar jeg forsoeger at compilere og lave en .dll med MingW C:\DOCUME~1\rr\LOCALS~1\Temp/ccIHaaaa.o(.eh_frame+0x11):cResult.cpp: undefined r eference to `__gxx_personality_v0' Jeg bruger flg kommando: C:\JavaC++\simplegui>gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -Ic:/j2sdk1. 4.2/include -Ic:/j2sdk1.4.2/include/win32 -shared cResult.cpp -o cResult.dll Der er tale om en JNI application!!! Men gaar ud fra at det er et c++ problem og smider det derfor i denne kategori...
Annonceindlæg fra Salesforce
20. august 2003 - 03:35
#1
min MingW er version 3.0.0 og jeg bruger win2000
20. august 2003 - 04:10
#2
NU har jeg kigget lidt paa nettet, og har proevet at bruge g++ istedet for Gcc, er der nogle der kan fortaelle mig forskellen? For nu faar jeg ikke den compileringsfejl laengere, men kan faktisk lave en .ddl fil...
20. august 2003 - 08:23
#3
gcc er en c compiler g++ er en c++ compiler Når du får en "undefined reference to .." så er det fordi du mangler at linke med en eller flere objektfiler.
20. august 2003 - 08:25
#4
Men start med at compile med g++ - så fjerner du givet vis nogle af fjlene. Post dem du får efterfølgende.
20. august 2003 - 08:54
#5
Koden til det hele kommer her! Jeg gider den snart ikke mere... package simplegui; import javax.swing.*; import java.awt.*; import javax.swing.border.*; import java.awt.event.*; import java.lang.Long; import java.lang.*; /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (result) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ public class SimpleGui extends JFrame { private static SimpleGui instance; private long Gui; public static String s; //////////////////////////////////////////////////////////////////////// public static SimpleGui getInstance() { if (instance == null) { instance = new SimpleGui(); ///////////////////////SINGLETON } return instance; } /////////////////////////////////////////////////////////////////////// public static long a = 0; public static long b = 0; public static String d; JFrame jFrame1 = new JFrame(); JPanel jPanel1 = new JPanel(); JButton Button1 = new JButton("1"); JButton Button2 = new JButton("2"); JButton Button3 = new JButton("3"); JButton ButtonSum = new JButton(); JTextField FieldResult = new JTextField(); TitledBorder titledBorder1; TitledBorder titledBorder2; BorderLayout borderLayout1 = new BorderLayout(); JTextField TextFieldResult = new JTextField(); JButton ButtomResult = new JButton(); JButton ButtonMulti = new JButton(); public SimpleGui() { if (instance == null) ////////////////MAKES SURE ONLY ONE GUI { try { jbInit(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { SimpleGui.getInstance(); } private void jbInit() throws Exception { titledBorder1 = new TitledBorder(""); titledBorder2 = new TitledBorder(""); jFrame1.getContentPane().setBackground(SystemColor.window); //jFrame1.setDefaultCloseOperation(jFrame1.EXIT_ON_CLOSE); jFrame1.setResizable(false); jFrame1.getContentPane().setLayout(borderLayout1); Button1.setBounds(new Rectangle(5, 42, 83, 27)); Button1.setText("1"); Button1.addActionListener(new SimpleGui_Button1_actionAdapter(this)); Button2.setBounds(new Rectangle(91, 42, 83, 27)); Button2.setText("2"); Button2.addActionListener(new SimpleGui_Button2_actionAdapter(this)); Button3.setBounds(new Rectangle(176, 42, 83, 27)); Button3.setText("3"); Button3.addActionListener(new SimpleGui_Button3_actionAdapter(this)); ButtonSum.setBounds(new Rectangle(5, 72, 83, 27)); ButtonSum.setText("+"); ButtonSum.addActionListener(new SimpleGui_ButtonSum_actionAdapter(this)); jPanel1.setBorder(titledBorder2); jPanel1.setDebugGraphicsOptions(0); jPanel1.setMaximumSize(new Dimension(100000, 100000)); jPanel1.setLayout(null); jPanel1.setSize(50, 30); TextFieldResult.setText(""); TextFieldResult.setBounds(new Rectangle(5, 7, 254, 32)); ButtomResult.setBounds(new Rectangle(176, 72, 83, 27)); ButtomResult.setText("="); ButtomResult.addActionListener(new SimpleGui_ButtomResult_actionAdapter(this)); ButtonMulti.setBounds(new Rectangle(90, 72, 83, 27)); ButtonMulti.setText("*"); ButtonMulti.addActionListener(new SimpleGui_ButtonMulti_actionAdapter(this)); jPanel1.add(ButtonSum, null); jPanel1.add(Button1, null); jPanel1.add(Button2, null); jPanel1.add(Button3, null); jPanel1.add(FieldResult, null); jPanel1.add(TextFieldResult, null); jPanel1.add(ButtomResult, null); jPanel1.add(ButtonMulti, null); jFrame1.getContentPane().add(jPanel1, BorderLayout.CENTER); jFrame1.setSize(new Dimension(300, 164)); jFrame1.setVisible(true); } void Button1_actionPerformed(ActionEvent e) { TextFieldResult.setText(TextFieldResult.getText() + "1"); } void Button2_actionPerformed(ActionEvent e) { TextFieldResult.setText(TextFieldResult.getText() + "2"); } void Button3_actionPerformed(ActionEvent e) { TextFieldResult.setText(TextFieldResult.getText() + "3"); } void ButtonSum_actionPerformed(ActionEvent e) { String f = TextFieldResult.getText(); a = Long.parseLong(f); d = "+"; TextFieldResult.setText(null); } void ButtonMulti_actionPerformed(ActionEvent e) { String f = TextFieldResult.getText(); a = Long.parseLong(f); d = "*"; TextFieldResult.setText(null); } void ButtomResult_actionPerformed(ActionEvent e) { String f = TextFieldResult.getText(); b = Long.parseLong(f); ResultInt res = new simplegui.ResultInt(a, b, d); TextFieldResult.setText(res.r); } } class SimpleGui_Button1_actionAdapter implements java.awt.event.ActionListener { SimpleGui adaptee; SimpleGui_Button1_actionAdapter(SimpleGui adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.Button1_actionPerformed(e); } } class SimpleGui_Button2_actionAdapter implements java.awt.event.ActionListener { SimpleGui adaptee; SimpleGui_Button2_actionAdapter(SimpleGui adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.Button2_actionPerformed(e); } } class SimpleGui_Button3_actionAdapter implements java.awt.event.ActionListener { SimpleGui adaptee; SimpleGui_Button3_actionAdapter(SimpleGui adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.Button3_actionPerformed(e); } } class SimpleGui_ButtonSum_actionAdapter implements java.awt.event.ActionListener { SimpleGui adaptee; SimpleGui_ButtonSum_actionAdapter(SimpleGui adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.ButtonSum_actionPerformed(e); } } class SimpleGui_ButtomResult_actionAdapter implements java.awt.event.ActionListener { SimpleGui adaptee; SimpleGui_ButtomResult_actionAdapter(SimpleGui adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.ButtomResult_actionPerformed(e); } } class SimpleGui_ButtonMulti_actionAdapter implements java.awt.event.ActionListener { SimpleGui adaptee; SimpleGui_ButtonMulti_actionAdapter(SimpleGui adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.ButtonMulti_actionPerformed(e); } } ************************************************** package simplegui; /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ public class ResultInt { public String r = ""; public ResultInt() { } public ResultInt(long a, long b, String d) { System.out.println("Inde i ResultInt"); r = cResult.cResult(a,b,d); } } ************************************************* package simplegui; /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ public class cResult { public cResult() { } public static native String cResult(long a, long b, String d); { System.out.println("Inde i cResult"); System.loadLibrary("cResult"); } } ************************************************** #include <stdio.h> #include <string.h> #include "cResult.h" JNIEXPORT jstring JNICALL Java_simplegui_cResult_cResult (JNIEnv *cntx, jclass me, jlong a, jlong b, jstring d) { const char *d2 = (cntx)->GetStringUTFChars(d,0); long result; char strresult[17]; result = 0; if(strcmp(d2,"+")==0) { result = a + b; } else if(strcmp(d2,"*")==0) { result = a * b; } (cntx)->ReleaseStringUTFChars(d,d2); sprintf(strresult,"%ld",result); return (cntx)->NewStringUTF(strresult); } ************************************************ Har ingen ide om hvad der er galt!
20. august 2003 - 08:55
#6
Kan godt kompilere det til en .dll, men kan ikke faa lov til at koere det...
20. august 2003 - 09:11
#7
Jeg har ikke selv erfaring med JNI. Men hvis jeg skulle rode med det ville jeg lave et hello world eksempel i c++ og få det til at virke i java. Når det så virker ville jeg tilføje den funktionalitet jeg mangler i Java. Altså, keep it simple, stupid.
20. august 2003 - 09:12
#8
Start evt. med at undersøge om din metode bliver kaldt (tilføj et par printf's i c++ koden).
20. august 2003 - 11:19
#9
OK. __gxx_personality_v0problemet var fordi du brugte gcc og ikke g++. (gcc linker kun med C bilblioteker mens g++ linker med C++ bibliotekerne også) Det problemer nu løst. Men nu virker det bare ikke. Hvilken fejl får du ?
20. august 2003 - 11:25
#10
Mine umiddelbare ideer er: 1) directory med DLL filen er ikke i PATH - det skal den være 2) du har ikke fået eksporteret symbolet i DLL filen rigtigt cResult.def skal indeholde: EXPORTS Java_simplegui_cResult_cResult
21. august 2003 - 07:20
#11
Nu faar jeg vist min gui, men trykker jeg paa ButtomResult, som starter kaldet til den native metode faar jeg flg fejl. Exception occurred during event dispatching: java.lang.UnsatisfiedLinkError: cResult at simplegui.ResultInt.<init>(ResultInt.java:21) at simplegui.SimpleGui.ButtomResult_actionPerformed +ca 1mill andre ting I min cResult.def, staar der som du har skrevet oven for Java_simplegui_cResult_cResult. Har sat en masse system.out.print("") ind i koden og det ser ud til at jeg slet ikke kommer ind i cResult.class Har du nogen ide om hvad der er galt?
21. august 2003 - 09:22
#12
Betyder at den ikke kan finde din DLL. Er directory med DLL i PATH ?
22. august 2003 - 03:08
#13
Alle filer til applicationen ligger i c:\JavaC++ mappen og min path ser ud som flg. PATH=C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;;C:\MinGW3.0.0\bin;path ;C:\j2sdk1.4.2\bin;path ;C:\jdk1.2.2\bin;path ;C:\jdk1.2.2\include;path ;C:\JavaC++\simplegui;path ;C:\JavaC++
22. august 2003 - 08:27
#14
Nu er det lidt forvirrende at DLL og metode hedder det samme. Kunen du evt. omdøbe den ene, fordi så kan vi mere tydeligt se om det er DLL'en den ikke kan finde eller det er metoden den ikke kan finde i DLL'en.
22. august 2003 - 08:36
#15
Det er min metode den ikke finder! Har lige om compileret saa dll'en nu hedder cResultDll.dll
22. august 2003 - 08:48
#16
Og du bruger en DEF fil (eller beder compileren eksportere alle symboler) ?
22. august 2003 - 08:55
#17
Jeps, ligesom du har skrevet tidligere...
22. august 2003 - 12:00
#18
Et eller andet går galt. Jeg er bange for at jeg skal have hele koden igen for at kunne prøve og genskabe problemet på min PC.
25. august 2003 - 01:06
#19
package simplegui; import javax.swing.*; import java.awt.*; import javax.swing.border.*; import java.awt.event.*; import java.lang.Long; import java.lang.*; /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (result) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ public class SimpleGui extends JFrame { private static SimpleGui instance; private long Gui; public static String s; public static SimpleGui getInstance() { if (instance == null) { instance = new SimpleGui(); } return instance; } public static long a = 0; public static long b = 0; public static String d; JFrame jFrame1 = new JFrame(); JPanel jPanel1 = new JPanel(); JButton Button1 = new JButton("1"); JButton Button2 = new JButton("2"); JButton Button3 = new JButton("3"); JButton ButtonSum = new JButton(); JTextField FieldResult = new JTextField(); TitledBorder titledBorder1; TitledBorder titledBorder2; BorderLayout borderLayout1 = new BorderLayout(); JTextField TextFieldResult = new JTextField(); JButton ButtomResult = new JButton(); JButton ButtonMulti = new JButton(); public SimpleGui() { if (instance == null) ////////////////MAKES SURE ONLY ONE GUI { try { jbInit(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { SimpleGui.getInstance(); } private void jbInit() throws Exception { titledBorder1 = new TitledBorder(""); titledBorder2 = new TitledBorder(""); jFrame1.getContentPane().setBackground(SystemColor.window); //jFrame1.setDefaultCloseOperation(jFrame1.EXIT_ON_CLOSE); jFrame1.setResizable(false); jFrame1.getContentPane().setLayout(borderLayout1); Button1.setBounds(new Rectangle(5, 42, 83, 27)); Button1.setText("1"); Button1.addActionListener(new SimpleGui_Button1_actionAdapter(this)); Button2.setBounds(new Rectangle(91, 42, 83, 27)); Button2.setText("2"); Button2.addActionListener(new SimpleGui_Button2_actionAdapter(this)); Button3.setBounds(new Rectangle(176, 42, 83, 27)); Button3.setText("3"); Button3.addActionListener(new SimpleGui_Button3_actionAdapter(this)); ButtonSum.setBounds(new Rectangle(5, 72, 83, 27)); ButtonSum.setText("+"); ButtonSum.addActionListener(new SimpleGui_ButtonSum_actionAdapter(this)); jPanel1.setBorder(titledBorder2); jPanel1.setDebugGraphicsOptions(0); jPanel1.setMaximumSize(new Dimension(100000, 100000)); jPanel1.setLayout(null); jPanel1.setSize(50, 30); TextFieldResult.setText(""); TextFieldResult.setBounds(new Rectangle(5, 7, 254, 32)); ButtomResult.setBounds(new Rectangle(176, 72, 83, 27)); ButtomResult.setText("="); ButtomResult.addActionListener(new SimpleGui_ButtomResult_actionAdapter(this)); ButtonMulti.setBounds(new Rectangle(90, 72, 83, 27)); ButtonMulti.setText("*"); ButtonMulti.addActionListener(new SimpleGui_ButtonMulti_actionAdapter(this)); jPanel1.add(ButtonSum, null); jPanel1.add(Button1, null); jPanel1.add(Button2, null); jPanel1.add(Button3, null); jPanel1.add(FieldResult, null); jPanel1.add(TextFieldResult, null); jPanel1.add(ButtomResult, null); jPanel1.add(ButtonMulti, null); jFrame1.getContentPane().add(jPanel1, BorderLayout.CENTER); jFrame1.setSize(new Dimension(300, 164)); jFrame1.setVisible(true); } void Button1_actionPerformed(ActionEvent e) { TextFieldResult.setText(TextFieldResult.getText() + "1"); } void Button2_actionPerformed(ActionEvent e) { TextFieldResult.setText(TextFieldResult.getText() + "2"); } void Button3_actionPerformed(ActionEvent e) { TextFieldResult.setText(TextFieldResult.getText() + "3"); } void ButtonSum_actionPerformed(ActionEvent e) { String f = TextFieldResult.getText(); a = Long.parseLong(f); d = "+"; TextFieldResult.setText(null); } void ButtonMulti_actionPerformed(ActionEvent e) { String f = TextFieldResult.getText(); a = Long.parseLong(f); d = "*"; TextFieldResult.setText(null); } void ButtomResult_actionPerformed(ActionEvent e) { String f = TextFieldResult.getText(); b = Long.parseLong(f); ResultInt res = new simplegui.ResultInt(a, b, d); TextFieldResult.setText(res.r); } } class SimpleGui_Button1_actionAdapter implements java.awt.event.ActionListener { SimpleGui adaptee; SimpleGui_Button1_actionAdapter(SimpleGui adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.Button1_actionPerformed(e); } } class SimpleGui_Button2_actionAdapter implements java.awt.event.ActionListener { SimpleGui adaptee; SimpleGui_Button2_actionAdapter(SimpleGui adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.Button2_actionPerformed(e); } } class SimpleGui_Button3_actionAdapter implements java.awt.event.ActionListener { SimpleGui adaptee; SimpleGui_Button3_actionAdapter(SimpleGui adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.Button3_actionPerformed(e); } } class SimpleGui_ButtonSum_actionAdapter implements java.awt.event.ActionListener { SimpleGui adaptee; SimpleGui_ButtonSum_actionAdapter(SimpleGui adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.ButtonSum_actionPerformed(e); } } class SimpleGui_ButtomResult_actionAdapter implements java.awt.event.ActionListener { SimpleGui adaptee; SimpleGui_ButtomResult_actionAdapter(SimpleGui adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.ButtomResult_actionPerformed(e); } } class SimpleGui_ButtonMulti_actionAdapter implements java.awt.event.ActionListener { SimpleGui adaptee; SimpleGui_ButtonMulti_actionAdapter(SimpleGui adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.ButtonMulti_actionPerformed(e); } } *********************************************************** package simplegui; /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ public class ResultInt { public String r = ""; public ResultInt() { } public ResultInt(long a, long b, String d) { System.out.println("Inde i ResultInt1"); r = cResult.cResult(a,b,d); System.out.println("Inde i ResultInt2"); } } *********************************************************** package simplegui; /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ public class cResult { public cResult() { System.out.println("Inde i cResult()"); } public static native String cResult(long a, long b, String d); { System.out.println("Inde i cResult(long a, long b, String d)"); System.loadLibrary("cResultDll"); } } ********************************************************* #include <stdio.h> #include <string.h> #include "cResult.h" JNIEXPORT jstring JNICALL Java_cResult_cResult (JNIEnv *cntx, jclass me, jlong a, jlong b, jstring d) { const char *d2 = (cntx)->GetStringUTFChars(d,0); long result; char strresult[17]; result = 0; if(strcmp(d2,"+")==0) { result = a + b; } else if(strcmp(d2,"*")==0) { result = a * b; } (cntx)->ReleaseStringUTFChars(d,d2); sprintf(strresult,"%ld",result); return (cntx)->NewStringUTF(strresult); } ************************************************************ Her er det hele saa, som skrevet tidligere, er det c++ kode der skal kaldes af jave, men jeg for en fejl jeg ikke kan lokalisere...
25. august 2003 - 16:28
#20
Med: package simplegui; /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ public class cResult { public cResult() { System.out.println("Inde i cResult()"); } public static native String cResult(long a, long b, String d); static { // <------------ System.out.println("Inde i cResult(long a, long b, String d)"); System.loadLibrary("cResultDll"); } } og: #include <stdio.h> #include <string.h> #include "cResult.h" #include <jni.h> /* <--------------- */ JNIEXPORT jstring JNICALL Java_simplegui_cResult_cResult (JNIEnv *cntx, jclass me, jlong a, jlong b, jstring d) { const char *d2 = (*cntx)->GetStringUTFChars(cntx,d,0); /* <--------------- */ long result; char strresult[17]; result = 0; if(strcmp(d2,"+")==0) { result = a + b; } else if(strcmp(d2,"*")==0) { result = a * b; } (*cntx)->ReleaseStringUTFChars(cntx,d,d2); /* <--------------- */ sprintf(strresult,"%ld",result); return (*cntx)->NewStringUTF(cntx,strresult); /* <--------------- */ } virker det hos mig.
26. august 2003 - 07:31
#22
Det er helt korrekt. I C++ ser det ud som flg. #include <stdio.h> #include <string.h> #include "cResult.h" #include <jni.h> /* <--------------- */ JNIEXPORT jstring JNICALL Java_simplegui_cResult_cResult (JNIEnv *cntx, jclass me, jlong a, jlong b, jstring d) { const char *d2 = (cntx)->GetStringUTFChars(d,0); /* <--------------- */ long result; char strresult[17]; result = 0; if(strcmp(d2,"+")==0) { result = a + b; } else if(strcmp(d2,"*")==0) { result = a * b; } (cntx)->ReleaseStringUTFChars(d,d2); /* <--------------- */ sprintf(strresult,"%ld",result); return (cntx)->NewStringUTF(strresult); /* <--------------- */ } Men faar stadig samme fejl om at den ikke finder min cResult.class... Samme problem som foer, saa nu ryger maskinen snart ud af vinduet!!!
26. august 2003 - 08:06
#23
Hvordan builder og kører du ? Jeg bruger: @echo off javac *.java javah -classpath .. -jni simplegui.cResult copy simplegui_cResult.h cResult.h del simplegui_cResult.h gcc -c -I\sunjava\jdk1.3.1\include -I\sunjava\jdk1.3.1\include\win32 cResult.c -o cResult.obj gcc -mdll -Wl,--base-file,base.tmp cResult.obj -o junk.tmp dlltool --dllname cResultDLL.dll --base-file base.tmp --output-exp exp.tmp --def cResult.def gcc -Wl,--enable-stdcall-fixup -mdll -Wl,exp.tmp cResult.obj -o cResultDLL.dll del *.tmp path=.;%PATH% java -classpath .. simplegui.SimpleGui
01. september 2003 - 05:04
#24
Gider ikke mere, det er kun problemer med kompileringen og det er spild af tid lige nu! Men mange tak for hjaelpen det var kanon!
Kurser inden for grundlæggende programmering