Avatar billede rhrathje Nybegynder
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...
Avatar billede rhrathje Nybegynder
20. august 2003 - 03:35 #1
min MingW er version 3.0.0 og jeg bruger win2000
Avatar billede rhrathje Nybegynder
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...
Avatar billede soreno Praktikant
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.
Avatar billede soreno Praktikant
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.
Avatar billede rhrathje Nybegynder
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!
Avatar billede rhrathje Nybegynder
20. august 2003 - 08:55 #6
Kan godt kompilere det til en .dll, men kan ikke faa lov til at koere det...
Avatar billede soreno Praktikant
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.
Avatar billede soreno Praktikant
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).
Avatar billede arne_v Ekspert
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 ?
Avatar billede arne_v Ekspert
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
Avatar billede rhrathje Nybegynder
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?
Avatar billede arne_v Ekspert
21. august 2003 - 09:22 #12
Betyder at den ikke kan finde din DLL.

Er directory med DLL i PATH ?
Avatar billede rhrathje Nybegynder
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++
Avatar billede arne_v Ekspert
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.
Avatar billede rhrathje Nybegynder
22. august 2003 - 08:36 #15
Det er min metode den ikke finder! Har lige om compileret saa dll'en nu hedder cResultDll.dll
Avatar billede arne_v Ekspert
22. august 2003 - 08:48 #16
Og du bruger en DEF fil (eller beder compileren eksportere alle symboler) ?
Avatar billede rhrathje Nybegynder
22. august 2003 - 08:55 #17
Jeps, ligesom du har skrevet tidligere...
Avatar billede arne_v Ekspert
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.
Avatar billede rhrathje Nybegynder
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...
Avatar billede arne_v Ekspert
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.
Avatar billede arne_v Ekspert
26. august 2003 - 07:02 #21
Iøvrigt skal du vist ikke tage dig så meget at de * jeg har sat ind foran
cntx.

Ifølge:
  http://java.sun.com/docs/books/tutorial/native1.1/implementing/cpp.html
har det noget at gøre med C versus C++.
Avatar billede rhrathje Nybegynder
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!!!
Avatar billede arne_v Ekspert
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
Avatar billede rhrathje Nybegynder
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!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester