JNI: Java findet lib, bleibt dann aber hängen

MattHHDE

Grünschnabel
Hallo

ich versuche mich gerade in das JNI-Thema einzuarbeiten und bleibe aber jetzt an einer stelle hängen (oder besser Java bleibt einfach hängen!)

Folgendes ist mein c-Code:
Code:
#include "StrLen.h" 
#include <stdio.h>    
JNIEXPORT jint JNICALL Java_StrLen_strlen( JNIEnv *env, jclass clazz, jstring s )  {
	printf( "Hallo!\n" );   
	return JNI_OK;  
}

Dies ist mein Java-Code:
Code:
public class StrLen {
	public static   native   int strlen( String s );
	public static void main( String args[] ) {
		System.load("Z:/cdt_workspace/JNI_Test_C/Release/JNI_Test_C.dll");
		System.out.println( strlen("Test.") );
	}
}

Wenn ich jetzt versuche das Programm zum laufen zu bringen, wird das Programm zwar gestartet, bleibt aber ohne weitere meldung beim System.load() hängen...

Hat einer von euch eine Idee was das sein könnte?
Ich programmiere unter Windows mit Eclipse 3.0 und CDT, gcc für cygwin. Die Einstellungen für das C-Projekt sind "Shared Libraray (Gnu for Windows)"

Danke
Matthias
 
Hallo!

hast du schonmal versucht die DLL ins Windows/System32 bzw. JAVA_HOME/bin Verzeichnis zu legen und das ganze über System.loadLibrary(....) zu laden?

Gruß Tom
 
Ich hab das Problem gefunden. Irgendwie gibt es da wohl Probleme mit dem CDT von Eclipse. Man muss ein Standardprojekt anlegen und dann alle Einstellungen von Hand machen.

Naja, ich habs jetzt mit nem anderen Tool hinbekommen :)

Danke fürs Reply!
Matthias
 
Hallo,

habe soeben auch ein Beispiel aus einem JNI Tutorial für Eclipse CDT und Cygwin versucht und habe nun das gleiche Problem wie mein Vorposter vor 3 Jahren.

IIm folgenden habe ich mal alle Codestücke angefügt. Die entsprechenden Einstellungen in eclipse habe ich aus dem Tutorial übernommen und nicht nochmal explizit aufgeschrieben.

Folgendermaßen sieht der JavaCode aus, der die native Methode aufruft:

Code:
package helloworld;

public class HelloWorld {

  public native void callNative(); 

 static {
	 System.loadLibrary("HelloWorld"); 
  }

  public static void main(String[] args) {

    System.out.println("Hallo HelloWorld.DLL?");
    new HelloWorld().callNative();
    System.exit(0);
     }
}

Im Source Ordner meines C-Projekts befinden sich 3 Dateien. Zum einen folgende Header-Datei:

Code:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class helloworld_HelloWorld */

#ifndef _Included_helloworld_HelloWorld
#define _Included_helloworld_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     helloworld_HelloWorld
 * Method:    callNative
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_helloworld_HelloWorld_callNative
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

Zum anderen die Implementierung der C-Methode (hello.c)

Code:
#include <jni.h>
#include "helloworld_HelloWorld.h"


JNIEXPORT void JNICALL Java_helloworld_HelloWorld_callNative (JNIEnv *env, jobject obj) {

   printf("Ja,mir gehts gut\n");
   return;}

Letztendlich die .def-Datei, die folgendermaßen aussieht (HelloWorld.def)

Code:
EXPORTS Java_helloworld_HelloWorld_callNative

Die Include-Pfade habe ich erfolgreich aufgenommen und auch beim G++ Linker wird g++ mit dem richtigen Pfad für die .def Datei angeben. Die .dll wird als HelloWorld.dll im Release Ordner des C-Projekts gespeichert.

Jetzt mein Problem: Wenn ich die .dll ins System32 Verzeichnis kopiere wird sie auch geladen und es gibt keine Fehlermeldung. Allerdings hängt sich das Programm auf, nachdem die Bibliothek geladen wurde.
Irgendwas scheint mit der DLL-Datei nicht in Ordnung zu sein. Kann mir jemand weiterhelfen?
 
Zurück