Avatar billede drunkensailor Nybegynder
04. april 2004 - 20:08 Der er 27 kommentarer og
1 løsning

Kald af funktioner fra andre sprog (C),

Jeg står og har brug for at kalde nogle C, C++,og C# funktioner (alle sammen liggende i objekter) i et Java program.
Såvidt jeg husker handler dette om indkapsling med er ikke sikker - er der nogle der kan fortælle hvordan den skal skæres??
Avatar billede soreno Praktikant
04. april 2004 - 20:10 #1
Det er JNI du skal kigge lidt på:
http://java.sun.com/docs/books/tutorial/native1.1/

(Jeg har ikke selv erfaring med JNI.)
Avatar billede arne_v Ekspert
04. april 2004 - 20:11 #2
JNI tillader dig at kalde C/C++ funktioner fra Java. Grundliggende laver du
en stub i Java, genererer en C/C++ stub udfra dden, lader den stub kalde
den egentlige kode og så builder du alt C/C++ til en DLL.

C# tror jeg ikke kan lade sig gøre i samme program.
Avatar billede drunkensailor Nybegynder
04. april 2004 - 20:26 #3
I skal nok få point - men vil det sige at man ikke kan benytte sig af c# objekter i java - under nogen omstændigheder???

Soreno smider du også lige et svar
Avatar billede drunkensailor Nybegynder
04. april 2004 - 20:28 #4
nå Arne v her er i alt fald dine point tak for hjælpen
Avatar billede drunkensailor Nybegynder
04. april 2004 - 20:29 #5
Jeg har problemer med at give point - jeg trykker på accepter, men siden reloader bare, arne kan du ikke også prøve at lægge et nyt svar?
Avatar billede drunkensailor Nybegynder
04. april 2004 - 20:31 #6
nå - nu lykkedes det...
Avatar billede soreno Praktikant
04. april 2004 - 20:31 #7
Det kan vel nok lade sig gøre at benytte C¤ objekter i Java.

Men det er muligvis ad en større omvej, der ikke kan betragtes som "inden for rimelighedens grænser".. :-)
Avatar billede drunkensailor Nybegynder
04. april 2004 - 20:33 #8
soreno, du skal have tak for hjælpen - men du glemte at ligge et svar;o)
Avatar billede arne_v Ekspert
04. april 2004 - 20:35 #9
Hvis jeg skulle integrere Java og C# ville jeg køre dem hver for sig og lave
noget socket kommunikation.
Avatar billede soreno Praktikant
04. april 2004 - 20:39 #10
I et spørgsmål kan der kun pointgives én gang. Derfor er det ikke muligt at lægge et svar.

Men, 'det går nok'. Jeg kan alligevel ikke bruge points til noget :-)
(jeg er ikke aktiv nok til at komme i betragtning til et gratis pro-abonnoment..)
Avatar billede drunkensailor Nybegynder
04. april 2004 - 20:44 #11
Har netop oprettet nyt spørgsmål, ved navn soreno under den fri debat - der er point til dig hvis du lægger et svar der... du skal ikke snydes... endnu engang tak for hjælpen.
Avatar billede soreno Praktikant
04. april 2004 - 20:46 #12
Avatar billede arne_v Ekspert
04. april 2004 - 20:55 #13
Sig til hvis du vil have lidt mere hjælp med JNI - jeg har leget
lidt med det med forskellige compilere og forskellige platforme.
Avatar billede drunkensailor Nybegynder
05. april 2004 - 13:34 #14
arne v - jeg tror lige jeg vil benytte mig af dit tilbud så...
jeg er nået til step 5 i jni guiden <a href="http://java.sun.com/docs/books/tutorial/native1.1/stepbystep/step5.html">step 5</a>, hvor jeg skal oprette et libary, og her får jeg et problem - når jeg skriver koden cl.... (tilpasset mit program) får jeg fejlen:

"'cl' is not recognized as an internal or external command,
operable program or batch file."

mangler jeg at opsætte et path eller hvad er problemet (jeg kører med Microsoft development environment 7.0 og .net framework 1.0).
 
ved du hvad det skyldes?
Avatar billede drunkensailor Nybegynder
05. april 2004 - 13:35 #15
nå - den vil ikke have html...
Avatar billede arne_v Ekspert
05. april 2004 - 13:50 #16
Ja.

Du mangler at have cl.exe i din PATH.
Avatar billede arne_v Ekspert
05. april 2004 - 13:52 #17
Jeg har en BAT fil til at sætte den - stay tuned.
Avatar billede arne_v Ekspert
05. april 2004 - 13:54 #18
C:\>type dotnet.bat
set INCLUDE=C:\PROGRA~1\MICROS~2.NET\Vc7\include
set LIB=C:\PROGRA~1\MICROS~2.NET\Vc7\lib
PATH=C:\WINNT\MICROS~1.NET\FRAMEW~1\V11~1.432;C:\PROGRA~1\MICROS~2.NET\Vc7\bin;
C:\PROGRA~1\MICROS~2.NET\Common7\IDE;%PATH%
Avatar billede arne_v Ekspert
05. april 2004 - 13:54 #19
Det er dog til .NET SDK 1.1, men du kan sikkert rette den til.
Avatar billede drunkensailor Nybegynder
05. april 2004 - 15:24 #20
Mange tak for hjælpen - med lidt modifikation fik jeg det til at køre - man må give dig, et svar fra dig kan bruges til noget...
Avatar billede drunkensailor Nybegynder
05. april 2004 - 15:47 #21
og dog - nu får jeg en linkerfejl (jeg er i gang med at følge vejledningen step, by step - med dennes eksempel) følgende er kopi af fejlmeddelelse - er der flere stier der skal sættes op (min libcmt.lib fil ligger i stien "C:\Program Files\Microsoft Visual Studio .NET\Vc7\lib" og denne sti er inkluderet under "lib" - så jeg kan ikke lige se hvad problemt er)?

C:\javaOgC>cl -Ic:\j2sdk1.4.2\include -Ic:\j2sdk1.4.2\include\win32 -LD HelloWor
ldImp.cpp -Fehello.dll
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.00.9466 for 80x86
Copyright (C) Microsoft Corporation 1984-2001. All rights reserved.

HelloWorldImp.cpp
Microsoft (R) Incremental Linker Version 7.00.9466
Copyright (C) Microsoft Corporation.  All rights reserved.

/dll
/implib:hello.lib
/out:hello.dll
HelloWorldImp.obj
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'

C:\javaOgC>
Avatar billede arne_v Ekspert
05. april 2004 - 15:53 #22
Korte lange sti navne måske ?
Avatar billede arne_v Ekspert
05. april 2004 - 22:57 #23
Jeg kommer lige med et komplet eksempel.
Avatar billede arne_v Ekspert
05. april 2004 - 22:57 #24
package minpakke;

public class MinKlasse {
    public native String dup(String s);
    static {
        System.loadLibrary("mitlib");
    }
}
Avatar billede arne_v Ekspert
05. april 2004 - 22:58 #25
#include <string.h>

#include <jni.h>

#include "minpakke_MinKlasse.h"

static char retbuf[1000];

JNIEXPORT jstring JNICALL Java_minpakke_MinKlasse_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);
}
Avatar billede arne_v Ekspert
05. april 2004 - 22:58 #26
package minpakke;

public class TestProgram {
    public static void main(String[] args) throws Exception {
        MinKlasse nat = new MinKlasse();
        System.out.println(nat.dup("abc"));
        System.out.println(nat.dup("123"));
    }
}
Avatar billede arne_v Ekspert
05. april 2004 - 22:58 #27
javac -classpath .. MinKlasse.java
javah -classpath .. -jni minpakke.MinKlasse
cl /c /I\sunjava\jdk1.3.1\include /I\sunjava\jdk1.3.1\include\win32 minpakke_MinKlasse.c
cl /LD minpakke_MinKlasse.obj /link /out:mitlib.dll
javac -classpath .. TestProgram.java
path=.;%PATH%
java -classpath .. minpakke.TestProgram
Avatar billede drunkensailor Nybegynder
05. april 2004 - 23:06 #28
er lidt træt nu og får ikke kikket på det mere i dag - men du skal have mange tak for hjælpen og når jeg engang får øjne i morgen, skal jeg lade dig vide om jeg har fattet det - også kunne det da godt tænkes du kunne få lidt flere point...
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