Simples JNI zum laufen bringen

seux

Aktives Mitglied
Hallo,

ich arbeite mich gerade durch das Kapitel über JNI aus dem Buch Java ist auch eine Insel – 24 Java Native Interface (JNI)

Jedoch hab ich da bisher so meine Schwierigkeiten die DLL Datei zu compilieren. Die Headerdatei hab ich mit javah bekommen. Meine .c Datei sieht wie folgt aus:

Java:
#include <jni.h>
#include "StrLen.h"
#include <stdio.h>
JNIEXPORT jint JNICALL Java_com_javatutor_jni_StrLen_strlen( JNIEnv *env, jclass clazz, jstring s )
{
  printf( "Hallo Java-Freunde!\n" );
  return 0;
}

Compilieren möchte ich das über den GCC Compiler. Hab da bisher folgenden Befehl:
Code:
gcc strlen.c -I D:\Libraries\Java -o strlen.dll
In dem Java Ordner befindet sich halt die jni.h. Wenn ich den compiler allerdings starte, bekomme ich einen ganzen Berg von Fehlermeldungen. Hier nur mal ein Ausschnitt davon:

Code:
jni.h:1901: error: `jint' declared as function returning a function
jni.h:1901: warning: data definition has no type or storage class
jni.h:1903: error: syntax error before '*' token
jni.h:1903: error: `jint' declared as function returning a function
jni.h:1903: warning: data definition has no type or storage class
jni.h:1904: error: syntax error before '}' token
jni.h:1934: error: syntax error before "jint"
jni.h:1935: warning: data definition has no type or storage class
jni.h:1937: error: syntax error before "jint"
jni.h:1938: warning: data definition has no type or storage class
jni.h:1940: error: syntax error before "jint"
jni.h:1941: error: syntax error before "jsize"
jni.h:1941: warning: data definition has no type or storage class
jni.h:1944: error: syntax error before "jint"
jni.h:1945: warning: data definition has no type or storage class
jni.h:1947: error: syntax error before "void"
jni.h:1948: warning: data definition has no type or storage class
In file included from strlen.c:2:
StrLen.h:15: error: syntax error before "jint"
StrLen.h:16: warning: data definition has no type or storage class
strlen.c:4: error: syntax error before "jint"
strlen.c:8:2: warning: no newline at end of file

Weiß jemand was ich da falsch mache?

gruß seux
 
T

troll

Gast
dann hast du das entsprechende kapitel aber nicht genau genug gelesen ...
du musst dem compiler als zusätzlichen include-pfad noch JDK_HOME\include sowie JDK_HOME\include\win32 bzw unter unix JDK_HOME/include/linux (oder so ähnlich) angeben ...
das dies zu tun ist kann man dem ant-script entnehmen ...

das dies so nicht direkt in der java-insel zu finden ist wundert mich zwar ... würde ich aber in anbetracht das es speziell für JNI und JNA gesonderte fach-bücher gibt noch mal durchgehen lassen ...

außerdem stört mich der sample-code : in StrLenDemo wird direkt strlen() gecallt ... ohne das diese static import ist oder sonstige bedingungen erfüllt sind das diese methode gefunden werden kann ... wie es in deinem source aussieht weis ich nicht ...

was genau du damit meinst das "D:\lib\java" der ort ist wo sich jni.h befindet weis ich nicht denn diese ist unter JDK_HOME\include zu finden ...

auch stört mich irgendwie das der parameter "-shared" fehlt der bei Libs (also DLL und SO) üblich ist ... wenn dieser fehlt könnte es , nach dem du es geschafft hast deinen native-code zu übersetzen , zu weiteren fehlern kommen da die "lib" dann nicht als solche gekennzeichnet ist (wofür der parameter "-shared" zuständig ist) ...
 

seux

Aktives Mitglied
Danke für deine Hilfe. Ich konnte die dll Datei nun compilieren. Der Befehl dazu:
Code:
gcc strlen.c -I "D:\Program Files\Java\jdk1.7.0_01\include" -I "D:\Program Files\Java\jdk1.7.0_01\include\win32" -shared -Wl,--add-stdcall-alias -o strlen.dll

So. Wenn ich jetzt allerdings den Java code laufen lasse, bekomme ich folgende Fehlermeldung:
Can't load IA 32-bit .dll on a AMD 64-bit platform

Ich hab den Fehler gegoogled und rausgefunden, dass meine dll wohl für x64 compiliert wurde, meine JVM aber auf 32Bit läuft. Die Lösung: die dll für 32Bit compilieren. also hab ich zu meinem Befehl noch -m32 hinzugefügt. Leider bleibt das Problem bestehen.

Code:
gcc strlen.c -I "D:\Program Files\Java\jdk1.7.0_01\include" -I "D:\Program Files\Java\jdk1.7.0_01\include\win32" -shared -Wl,--add-stdcall-alias [B]-m32[/B] -o strlen.dll

Und hier nochmal der Code

StrLen.java
Java:
package com.javatutor.jni;


public class StrLen {
	static {
	    System.loadLibrary( "strlen" );
	  }
	  public static	native int strlen( String s );
}

JNI_Main.java
Java:
package com.javatutor.jni;


public class JNI_Main
{
  public static void main( String[] args)
  {
    System.out.println( StrLen.strlen("2003 UB313") );
  }
}
 

schulli

Mitglied
Can't load IA 32-bit .dll on a AMD 64-bit platform

Das meint doch aber, dass deine DLL 32 bit ist und die JVM 64 bit? Wenn du eine 32 Bit JVM hast müsste die unter C:\Program Files (x86)\Java zu finden sein. Sonst probier mal

Java:
gcc strlen.c -I "D:\Program Files\Java\jdk1.7.0_01\include" -I "D:\Program Files\Java\jdk1.7.0_01\include\win32" -shared -Wl,--add-stdcall-alias -m64 -o strlen.dll
 

seux

Aktives Mitglied
Da bekomm ich beim compilieren folgende Fehlermeldung:

strlen.c:1: sorry, unimplemented: 64-bit mode not compiled in
 

schulli

Mitglied
Dann hast du jetzt 2 Möglichkeiten:

1. Den c++ Code mit 64 Bit kompilieren. Da brauchst du einen Compiler, der das unterstützt.
MinGW gibt es für 64 bit.

2. Den Java Code mit einer 32 JVM laufen lassen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Simples Risiko-Spiel Java Basics - Anfänger-Themen 5
S Gibt es ein simples JWebbrowser Element? Java Basics - Anfänger-Themen 6
L Simples Spielfeld erzeugen Java Basics - Anfänger-Themen 1
P Simples Kartenspiel Java Basics - Anfänger-Themen 1
Olis Erste Schritte Simples Memory Spiel möglich? Java Basics - Anfänger-Themen 1
J Suche simples Beispiel für die EOFException Java Basics - Anfänger-Themen 1
P simples Program läuft nicht ;? Java Basics - Anfänger-Themen 9
J Starthilfe für ein "simples" Spiel Java Basics - Anfänger-Themen 2
J Simples Programm - Fehler im Konstruktor Java Basics - Anfänger-Themen 2
C simples Formel programm Java Basics - Anfänger-Themen 5
C simples Umbennen in Klasse File Java Basics - Anfänger-Themen 4
T Problem mit Abstract Windowing Toolkit(simples Problem) Java Basics - Anfänger-Themen 8
F Ganz simples Problem: Kovertieren von Double zu Integer Java Basics - Anfänger-Themen 2
D Ein simples Problem . *verwirrt sei* Java Basics - Anfänger-Themen 2
B Robot auf virtuellem Desktop laufen lassen? Java Basics - Anfänger-Themen 4
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
H For-Schleife bis Index von Eingabe laufen lassen Java Basics - Anfänger-Themen 24
N Erste Schritte HelloWorld möchte einfach nicht laufen Java Basics - Anfänger-Themen 11
H For-Schleife für 60 sekunden laufen lassen Java Basics - Anfänger-Themen 1
V Wie lasse ich die for-Schleife so oft laufen wie per Scanner angegeben? Java Basics - Anfänger-Themen 3
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
C LMC laufen kriegen, welches Java brauche ich ? Java Basics - Anfänger-Themen 5
M Methoden Zwei Methoden in einem Program laufen lassen...aber wie? Java Basics - Anfänger-Themen 2
M Methoden zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
O Methoden 3 Methoden gleichzeitig laufen lassen in der Console Java Basics - Anfänger-Themen 2
P SystemTray: Programm sol im Hintergrund weiter laufen Java Basics - Anfänger-Themen 30
H Path2D zerlegen und Objekt drauf "laufen" lassen Java Basics - Anfänger-Themen 11
K Erste Schritte Stoppuhr will nicht laufen Java Basics - Anfänger-Themen 3
R Funktionen Synchron laufen lassen Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
K Eine bestimmte Zeit, eine Schleife laufen lassen. Java Basics - Anfänger-Themen 4
M Bekomm altes Uni-Projekt in java nicht mehr zum laufen Java Basics - Anfänger-Themen 7
O Über Map laufen Erklärung Java Basics - Anfänger-Themen 4
F Erste Schritte Unter Windows programmieren und dann auf Linux laufen lassen Java Basics - Anfänger-Themen 4
B Durch eine Liste von Strings laufen Java Basics - Anfänger-Themen 6
P Webservice erstellen und laufen lassen Java Basics - Anfänger-Themen 1
K Durch ArrayList laufen Java Basics - Anfänger-Themen 8
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
F Eclipse und LWJGL - Bringe workspace nicht zum laufen Java Basics - Anfänger-Themen 2
G Erste Schritte von Eclipse zur Anwendung: Programme auf anderen Rechnern zum Laufen bringen Java Basics - Anfänger-Themen 4
C Kugel laufen lassen Java Basics - Anfänger-Themen 25
C Vererbung Wie bekomm ich das Programm zum laufen? Java Basics - Anfänger-Themen 4
0 Grafik eine bestimmte Strecke laufen lassen Java Basics - Anfänger-Themen 6
R java-programme schneller laufen lassen Java Basics - Anfänger-Themen 41
A Nedit für Mac zum laufen bringen Java Basics - Anfänger-Themen 2
C BlueJ zum Laufen bekommen Java Basics - Anfänger-Themen 14
A JBoss-Anwendung soll im Singleton-Mode laufen Java Basics - Anfänger-Themen 6
G Poi 3.5-Final zum laufen bringen Java Basics - Anfänger-Themen 2
M Online-Java-Games offline spielen? / Jar-Files zum laufen bringen? Java Basics - Anfänger-Themen 6
D Wie bringe ich dieses Programm als .jar zum laufen ? Java Basics - Anfänger-Themen 12
D In eclipse Methode von Schnittstelle zum Laufen bringen? Java Basics - Anfänger-Themen 14
M 2 Methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 2
brainray Einfachen RMI Server bei einem Provider zum Laufen bringen Java Basics - Anfänger-Themen 3
S Schleifen zeitversetzt laufen lassen Java Basics - Anfänger-Themen 3
S Java Programm extern laufen lassen Java Basics - Anfänger-Themen 10
J Threads asynchron laufen lassen Java Basics - Anfänger-Themen 4
T Mehr Anfänger geht nicht - Wie bekomme ich das zum laufen! Java Basics - Anfänger-Themen 6
G Threads prüfen, ob diese noch laufen. Java Basics - Anfänger-Themen 3
D 2x .jar Dateien laufen lassen Java Basics - Anfänger-Themen 2
D Java auf USB-Stick einrichten um FreeMind zum laufen zu bringen Java Basics - Anfänger-Themen 4
F Wie kann man Quellcodes uber die Konsole laufen lassen? Java Basics - Anfänger-Themen 6
E Vermeiden,dass mehrere Instanzen eines Java-Programms laufen Java Basics - Anfänger-Themen 2
T will nich als Applet laufen Java Basics - Anfänger-Themen 7
J Java Programm "IR-System" laufen Java Basics - Anfänger-Themen 2
J Rekursiv muss dass laufen! Java Basics - Anfänger-Themen 11
C Nach Catch-Klausel Programm weiter laufen lassen Java Basics - Anfänger-Themen 5
M Bekomme Programm nicht zum laufen HILFEEEE! Java Basics - Anfänger-Themen 28
M Timer als Thread laufen lassen? Java Basics - Anfänger-Themen 4
H KeyAdapter/KeyListener zum laufen kriegen Java Basics - Anfänger-Themen 3
jacquipre Eine Suchmethode im Hintergrund laufen lassen (Threads?) Java Basics - Anfänger-Themen 12
lan2711 Class Dateien auf anderen Rechner zum Laufen kriegen. Java Basics - Anfänger-Themen 5
L IOTools zum Laufen bringen Java Basics - Anfänger-Themen 2
B RetroGuard zum Laufen bringen Java Basics - Anfänger-Themen 11
C Applet will nicht laufen Java Basics - Anfänger-Themen 13
P meine java applets laufen nicht bei meinen freunden Java Basics - Anfänger-Themen 5
FireHorses Benutzernamen aus PrivateChannel(Interaction) auf Server bringen Java Basics - Anfänger-Themen 0
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
P Was genau bringt mir es ein Array in eine Liste zu bringen Java Basics - Anfänger-Themen 3
P Arraylist zu einem Array bringen mit Verschachtelung Java Basics - Anfänger-Themen 11
C Werte im Vector in zufällige Reihenfolge bringen Java Basics - Anfänger-Themen 14
C Vector-Inhalt in zufällige Reihenfolge bringen Java Basics - Anfänger-Themen 6
V wie kann ich eine laufende Klasse zum "stopen" bringen und zur main zurückkehren? Java Basics - Anfänger-Themen 11
H Erste Schritte Einfaches Programm und GUI zusammen bringen Java Basics - Anfänger-Themen 3
G Packages -> was bringen sie? Java Basics - Anfänger-Themen 4
V .jar Programm auf Webseite bringen Java Basics - Anfänger-Themen 7
W JButton in gleiche Größe bringen Java Basics - Anfänger-Themen 4
JStickman Was bringen Bit-Operatoren? Java Basics - Anfänger-Themen 14
H Buchstabe in Programm bringen Java Basics - Anfänger-Themen 6
A Static in Funktionen bringen Java Basics - Anfänger-Themen 7
S if-Abfragen bringen mich zum VERZWEIFELN! Java Basics - Anfänger-Themen 12
T String beschneiden, Tokenizer und Substring bringen nix Java Basics - Anfänger-Themen 5
B JOptionPane in vordergrund bringen Java Basics - Anfänger-Themen 2
P Inhalte aus Methoden in String Arrays bringen Java Basics - Anfänger-Themen 4
B Text von Knuddels Chatfenster in mein Programm bringen? Java Basics - Anfänger-Themen 5
C Farbe ins Spiel bringen Java Basics - Anfänger-Themen 2
G Splitter in Maske bringen Java Basics - Anfänger-Themen 6
1 Ergebnis in ein Jlabel bringen Java Basics - Anfänger-Themen 3
A String von einer Klasse in die ander zu bringen Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben