Avatar billede rhrathje Nybegynder
08. august 2003 - 01:20 Der er 8 kommentarer og
1 løsning

Interface imellem en C++ application og en java GUI

Hej Folkens.

Er der nogen der kan give mig en ide til hvordan dette maaske kan lade sig goere? Jeg har ikke den store erfarring med C++, og sidder nu i en Australsk forskningsvirksomhed og skal undersoege hvordan man kobler en Java GUI paa en C++ application, og kunne derfor godt bruge noget hjaelp...
Avatar billede rhrathje Nybegynder
08. august 2003 - 03:48 #1
Hvis der er nogen der er "up for it" saa ville det vaere rigtig fedt hvis jeg f.eks. kunne faa koden til en lille lommeregner hvor GUI'en er lavet i Java, og resten er C++. Den skal ikke kunne andet, end at man kan taste de forskellige tal og saa kunne vaelge imellem regne operatorene +-*/ og selvfoelgelig faa et rigtigt resultat ud...
Avatar billede arne_v Ekspert
08. august 2003 - 07:09 #2
Du skal bruge JNI.

Du laver en Java klasse med native methods.

javah'er den.

Laver en DLL/SO med de rigtige metoder som kalder den rigtige C++ kode.
Avatar billede arne_v Ekspert
08. august 2003 - 07:18 #3
Eksempel (lidt simplere end lomme regner):

TestJNI.java

package test;

public class TestJNI {
    public native String dup(String s);
    static {
        System.loadLibrary("testjni");
    }
}

test_TestJNI.c

#include <string.h>

#include <jni.h>

#include "test_TestJNI.h"

static char retbuf[1000];

JNIEXPORT jstring JNICALL Java_test_TestJNI_dup(JNIEnv *cntx, jobject me, jstring s)
{
  const char *s2 = (*cntx)->GetStringUTFChars(cntx,s,0);
  strcpy(retbuf,s2);
  strcat(retbuf,s2), 
  (*cntx)->ReleaseStringUTFChars(cntx,s,s2);
  return (*cntx)->NewStringUTF(cntx,retbuf);
}

TestTestJNI.java

package test;

public class TestTestJNI {
    public static void main(String[] args) throws Exception {
        TestJNI nat = new TestJNI();
        System.out.println(nat.dup("abc"));
        System.out.println(nat.dup("123"));
        System.out.println(nat.dup("æøå"));
    }
}

Build på windows med GCC:

build.bat

@echo off
javac TestJNI.java
javah -classpath .. -jni test.TestJNI
gcc -c -I\sunjava\jdk1.3.1\include -I\sunjava\jdk1.3.1\include\win32 test_TestJNI.c -o test_TestJNI.obj
gcc -mdll -Wl,--base-file,base.tmp test_TestJNI.obj -o junk.tmp
dlltool --dllname testjni.dll --base-file base.tmp --output-exp exp.tmp --def TestJNI.def
gcc -Wl,--enable-stdcall-fixup -mdll -Wl,exp.tmp test_TestJNI.obj -o testjni.dll
del *.tmp
javac -classpath .. TestTestJNI.java
path=.;%PATH%
java -classpath .. test.TestTestJNI

TestJNI.def

EXPORTS
Java_test_TestJNI_dup
Avatar billede rhrathje Nybegynder
08. august 2003 - 07:37 #4
Det er super... Jeg har selv fundet ud af en del, men naar jeg skal have lavet .dll filen, saa skal jeg i flg. en tutorial paa sun's hjemmeside skal skrive noget i stil med flg. i dos:

cl -Ic:\java\include -Ic:\java\include\win32
      -LD HelloWorldImp.c -Fehello.dll

her er problemet bare, at cl ikke er kendt, og jeg kan ikke finde den nogle steder... Hvor finder jeg den henne?
Avatar billede arne_v Ekspert
08. august 2003 - 07:42 #5
cl er Microsoft Visual Studio C++.

Den koster penge.

Du kan hente mingw gcc gratis og bruge den.

Se ovenfor for kommandoer.
Avatar billede arne_v Ekspert
08. august 2003 - 07:44 #6
Avatar billede arne_v Ekspert
08. august 2003 - 08:11 #7
Min I må da have en compiler til den eksisterende kode !?
Avatar billede rhrathje Nybegynder
11. august 2003 - 05:18 #8
Bruger mingw i oejeblikket, men da jeg aldrig har arbejd med c++ og mingw er jeg lidt paa herrens mark :-)

dlltool --dllname testjni.dll --base-file base.tmp --output-exp exp.tmp --def TestJNI.def

Koerer jeg denne linie, faar jeg en fejl der hedder at den ikke kan aabne def filen? Nogen ide om hvad det kan skyldes? Ellers er der ved at vaere styr paa det hele- tror jeg...
Avatar billede arne_v Ekspert
11. august 2003 - 09:16 #9
Har du lavet def filen ?

Fra mit eksempel:

TestJNI.def

EXPORTS
Java_test_TestJNI_dup
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