Avatar billede rhrathje Nybegynder
18. august 2003 - 04:45 Der er 6 kommentarer og
1 løsning

Store problemer med JNI!

Hejza eksperter.

Jeg har nogle gevaldige problemer med JNI! Jeg har flg. kode. Det skulle meget gerne blive en meget simpel "lommeregner" med 3 tal, og 2 regneoperatorer.

Har ingen ide om hvordan jeg faar skidtet til at virke, har forsoegt at laese om JNI, men...


******************************************
SimpleGui.java
******************************************
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);    //Opretter en instans af klassen ResultInt
    //TextFieldResult.setText(ResultInt.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);
  }
}
********************************************
ResultInt.java
********************************************
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 ResultInt()
  {
  }

  public ResultInt(long a, long b, String d)
  {
    System.out.println("Inde i ResultInt");
    String r = cResult.cResult(a,b,d);
  }
}

********************************************
cResult.java
********************************************
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");
  }
}
*******************************************
cResult.cpp
*******************************************
#include "cResult.h"
#include <stdio.h>
class cResult
{
public:
  void cResult(long a, long b, CString d);
  cString r;

private:
  jlong result;
}

JNIEXPORT jstring JNICALL Java_cResult_cResult
  (JNIEnv *, jclass, jlong, jlong, jstring);
{
  if(d.Compare("+")==0)
  {
    result = a + b;
    r.Format("%d", result);
  }
  else if(d.Compare("*")==0)
  {
    result = a * b;
    r.Format("%d", result);
  }
}
********************************************

//RHRathje
Avatar billede rhrathje Nybegynder
18. august 2003 - 04:47 #1
Er totalt nye i c++ hvilket jo ikke goer det lettere... Vil gerne have returneret en String fra cResult til ResultInt
Avatar billede simonvalter Praktikant
18. august 2003 - 07:23 #2
nu ved jeg heller ikke selv meget om hverken jni eller cpp
men jeg fandt lige dette eksempel .. måske kan du bruge det.
http://home.pacifier.com/~mmead/jni/cs510ajp/example_details.html#HelloWorldImp.cpp
jeg testede det selv og det var egentligt nemt nok
jeg kan prøve med din lommeregner når jeg kommer hjem fra skole .. men de andre har nok været forbi inden da ;)
Avatar billede rhrathje Nybegynder
18. august 2003 - 07:28 #3
Den HelloWorld, har jeg lavet tidligere, har ogsaa lavet et par andre helt smaa applikationer, men den her lommeregner, giver mig altsaa graa haar i hovedet...
Avatar billede riversen Nybegynder
18. august 2003 - 07:49 #4
jeg har et simpelt JNI eksempel hvor java kalder c++ som fylder i en vector i java
Avatar billede riversen Nybegynder
18. august 2003 - 07:52 #5
næ, jeg kan ikke finde det pt
Avatar billede arne_v Ekspert
18. august 2003 - 14:19 #6
Jeg har totalt omskrevet din C kode:

#include <stdio.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(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,"%d",result);
  return (*cntx)->NewStringUTF(cntx,strresult);
}

Og så en lille bitte rettelse i Java koden:

package simplegui;

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);
  }
}

  void ButtomResult_actionPerformed(ActionEvent e)
  {
    String f = TextFieldResult.getText();
    b = Long.parseLong(f);
    ResultInt res = new simplegui.ResultInt(a, b, d);    //Opretter en instans af klassen ResultInt
    TextFieldResult.setText(res.r);
  }

og så virker det faktisk !
Avatar billede rhrathje Nybegynder
19. august 2003 - 07:21 #7
Takker mange gange! Maa se om jeg kan faa det kompileret...
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