Avatar billede themepark Nybegynder
16. februar 2006 - 21:25 Der er 17 kommentarer og
1 løsning

Problemer med JNI og DJGPP

Jeg har fulgt JNI tutorialen http://java.sun.com/docs/books/tutorial/ og prøvet at få Hello World eksemplet til at virke. Jeg bruger DJGPP som min C compiler.

Jeg er nået til step 4 i tutorialen, som handler om at skrive .c filen, og den har jeg kopieret direkte fra siden. For at være sikker på at den virker, har jeg prøvet at kompilere den, med det resultat at jeg får i hundredevis af fejl omkring jni.h, som jeg har kopieret direkte fra jdk's include bibliotek og lagt i DJGPP's include bibliotek.

Yderligere får jeg følgende fejl omkring min .c og .h fil:
In file included from C:\HelloWorldImp.c:2:
C:\/HelloWorld.h:15: error: syntax error before 'void'
C:\/HelloWorld.h:16: warning: data definition has no type or storage class
C:\HelloWorldImp.c:5: error: syntax error before 'void'

Min HelloWorld.h fil ser således ud:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:    HelloWorld
* Method:    displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

Og min HelloWorldImp.c fil ser således ud:
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
    printf("Hello world!\n");
    return;
}

Hvad i alverden kan der være galt?
Avatar billede arne_v Ekspert
16. februar 2006 - 21:32 #1
udover jni.h skal der ogsaa inkluderes en platform specifik .h fil
Avatar billede themepark Nybegynder
16. februar 2006 - 21:34 #2
Hmm, der findes en dos.h i DJGPP's include bibliotek, burde det ikke være godt nok?
Avatar billede arne_v Ekspert
16. februar 2006 - 21:38 #3
http://www.eksperten.dk/artikler/252

har ogsaa lidt intro og build kommando til GCC/mingw32

den maa vaere naeste den samme for GCC/DJGPP
Avatar billede arne_v Ekspert
16. februar 2006 - 21:43 #4
hvorfor bruger du DJGPP fremfor mingw ?

eneste fordel jeg kender ved DJGPP fremfor mingw er at den kan koere under DOS, men
det kan Java ikke, saa ...
Avatar billede themepark Nybegynder
16. februar 2006 - 21:46 #5
Du har faktisk nævnt det. Jeg ville prøve at lave noget, der kunne køre under DOS, men hvis Java ikke kan det, så er der åbenbart ingen vej udenom Windows :(
Avatar billede arne_v Ekspert
16. februar 2006 - 21:52 #6
Directory of C:\Program Files\Java\jdk1.5.0\include

11/30/2005  03:10 PM    <DIR>          .
11/30/2005  03:10 PM    <DIR>          ..
11/30/2005  03:10 PM            8,498 jawt.h
11/30/2005  03:10 PM            5,926 jdwpTransport.h
11/30/2005  03:10 PM            68,021 jni.h
11/30/2005  03:10 PM            39,355 jvmdi.h
11/30/2005  03:10 PM            22,210 jvmpi.h
11/30/2005  03:10 PM            64,940 jvmti.h
11/30/2005  03:10 PM    <DIR>          win32
              6 File(s)        208,950 bytes

Directory of C:\Program Files\Java\jdk1.5.0\include\win32

11/30/2005  03:10 PM    <DIR>          .
11/30/2005  03:10 PM    <DIR>          ..
11/30/2005  03:10 PM              856 jawt_md.h
11/30/2005  03:10 PM              437 jni_md.h
              2 File(s)          1,293 bytes

det er de sidste som er dem jeg snakker om (de inkluderes fra jni.h)
Avatar billede arne_v Ekspert
16. februar 2006 - 21:53 #7
Java kan ikke koere paa DOS

(omend det da kunne vaere sjovt at se hvad gcj goer under DJGPP)
Avatar billede themepark Nybegynder
16. februar 2006 - 21:58 #8
gcj? Nå, men jeg har prøvet at compile den efter din artikel, og jeg får ikke nogle fejl fra min HelloWorldImp.c fil, men stadig en del fra jni.h.

Mit DJGPP bibliotek er C:\DJGPP\bin, hvor jeg også står i DOS prompten. Jeg har kopieret JDK biblioteket til C:\jdk15 pga. DJGPP's problemer med lange filnavne. Jeg har min HelloWorldImp.c og HelloWorld.h i C:\ Og så kører jeg følgende kommando fra C:\DJGPP\bin i DOS prompten.

C:\DJGPP\bin>gcc -c -IC:\jdk15\include -IC:\jdk15\include\win32 C:\HelloWorldImp
.c -o HelloWorld

Hvilket bl.a. giver følgende fejl (kun få af dem, da der stadigvæk er mindst 100):
C:/jdk15/include/jni.h:736: error: syntax error before '}' token
C:/jdk15/include/jni.h:1862: error: syntax error before '*' token
C:/jdk15/include/jni.h:1862: warning: no semicolon at end of struct or union
C:/jdk15/include/jni.h:1863: error: syntax error before '*' token
C:/jdk15/include/jni.h:1864: error: syntax error before '*' token
C:/jdk15/include/jni.h:1872: error: syntax error before '}' token
C:/jdk15/include/jni.h:1872: warning: data definition has no type or storage cla
ss
C:/jdk15/include/jni.h:1888: error: syntax error before '*' token
C:/jdk15/include/jni.h:1888: warning: no semicolon at end of struct or union
C:/jdk15/include/jni.h:1890: error: syntax error before '*' token
C:/jdk15/include/jni.h:1892: error: syntax error before '*' token
C:/jdk15/include/jni.h:1894: error: syntax error before '*' token
C:/jdk15/include/jni.h:1896: error: syntax error before '*' token
C:/jdk15/include/jni.h: In function '__declspec':
C:/jdk15/include/jni.h:1928: error: syntax error before 'JNI_GetDefaultJavaVMIni
tArgs'
Avatar billede themepark Nybegynder
16. februar 2006 - 22:38 #9
Hmm, jeg tror jeg har fundet ud af hvad problemet er. Typer som jboolean og deslige er ikke blevet defineret vha. typedef, som bl.a. jint bliver det i jni_md.h. Men hvor kan jeg finde filen der indeholder de typedefs? Den findes åbenbart ikke i hverken jdk eller DJGPP.
Avatar billede themepark Nybegynder
16. februar 2006 - 22:48 #10
Det var det så heller ikke, de er jo defineret i jni.h...så er jeg atter på bar bund :(
Avatar billede themepark Nybegynder
17. februar 2006 - 09:14 #11
Nu skiftede jeg så til at bruge MinGW som min compiler, og vupti, så var der ingen fejl :D Dog har jeg nu det problem, at gcc -c i din artikel compiler fint, der kommer ingen fejl meddelelser, men der bliver tilsyneladende heller ikke oprettet en .obj fil :(

C:\MinGW\bin>gcc -c -IC:\jdk15\include -IC:\jdk15\include\win32 C:\Xtra\HelloWor
ldImp.c

C:\MinGW\bin>gcc -s -shared -Wl,--export-all,--kill-at C:\Xtra\HelloWorld.obj -o
C:\Xtra\HelloWorld.dll
gcc: C:\Xtra\HelloWorld.obj: No such file or directory

C:\MinGW\bin>gcc -s -shared -Wl,--export-all,--kill-at C:\Xtra\HelloWorldImp.obj
-o C:\Xtra\HelloWorld.dll
gcc: C:\Xtra\HelloWorldImp.obj: No such file or directory
Avatar billede themepark Nybegynder
17. februar 2006 - 11:39 #12
Godt så...vi glemmer lige alt hvad jeg har skrevet siden sidst du skrev :S

Jeg har fået det hele til at virke nu, præcis efter din manual. Jeg tror, at jeg ikke har fået hele koden med fra din artikel, da Ekspertens artikel design format i hvert fald her gør at noget af en linje bliver skjult uden scrollbars, hvis linjen er for lang.

Smid et svar, så smider jeg nogle point i din retning :)
Avatar billede arne_v Ekspert
17. februar 2006 - 16:54 #13
ok
Avatar billede themepark Nybegynder
19. februar 2006 - 14:14 #14
Bare lige for at være sikker på at jeg er helt med på det her.

Der er ingen grund til at compile mit C program med en DOS compiler, eftersom det skal bruges sammen med et Java program, og Java programmer kan ikke køre på en maskine med en ren DOS installation. Har jeg forstået det rigtigt?
Avatar billede arne_v Ekspert
19. februar 2006 - 23:39 #15
jeps
Avatar billede themepark Nybegynder
19. februar 2006 - 23:45 #16
Må jeg lige spørge, hvorfor Java egentlig ikke kan køre på DOS? Bare lige for at forstå det helt.
Avatar billede arne_v Ekspert
20. februar 2006 - 00:02 #17
JVM kraever meget memory (starter typisk omkring 32 MB)

java.net kraever TCP/IP hvilket ikke er standard i DOS

java.awt og java.swing kraever en grafisk brugergraenseflade

Unicode/UTF-8 support

ret haabloest at faa J2SE til at koere paa DOS

J2ME burde kunne koere paa DOS
Avatar billede themepark Nybegynder
20. februar 2006 - 00:27 #18
Hmm, ja jeg havde ikke tænkt på det med Swing, jeg skal helt klart bruge Swing. Tusind tak.
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