JNI dll verweden

Status
Nicht offen für weitere Antworten.

outbreaker

Bekanntes Mitglied
Ich versuche mich gerade mit JNI Programmierung. Meine Frage ist eher eine C++ Frage glaube ich jedenfalls aber ich versuche es trotzdem mal
Ich habe ein einfaches Java Programm:

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

und
StrLen.java
Code:
public class StrLen {

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

dazu habe ich die h Datei automatisch generieren lassen mit javah

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

#ifndef _Included_StrLen
#define _Included_StrLen
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     StrLen
 * Method:    strlen
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_StrLen_strlen
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif

und dann meine c-Datei dazu
Code:
#include <jni.h> 
#include "StrLen.h" 
#include <stdio.h> 

JNIEXPORT jint JNICALL Java_StrLen_strlen( 
                            JNIEnv *env, jclass clazz, jstring s ) 
{ 
  printf( "Hallo Java-Freunde2!\n");
  return 0; 
}

Wenn ich jetzt das ganze mit gcc kompiliere geht es ohne Probleme
gcc -ID:\Programme\Java\jdk1.6.0_05\include\ -ID:\Programme\Java\jdk1.6.0_05\include\win32\ -shared -Wl,--add-stdcall-alias -o test.dll strlen.c

Nun habe ich mir mit Visual Studio 2005 ein Win32 Projekt > DLL erstellt

habe dann meine h und c Datei eingefügt und habe dann auf "Als C-Code kompilieren (/TC)" umgestellt
kommt auch eine dll raus wenn ich diese dann aber in mein Eclipseprojekt kopiere und dann mein Java Projekt starte bekomme ich diesen Fehler:

Exception in thread "main" java.lang.UnsatisfiedLinkError: D:\Workspace\JNI_PCIe\src\test.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at StrLen.<clinit>(StrLen.java:5)
at Main.main(Main.java:6)

Es fehlen also scheinbar noch Einstellungen in VS oder muss ich noch was anderes Beachten?
Die Datei von VS ist auch nur 6 KB groß und die von gcc ist 12,9 KB groß

Ich hoffe es hat schon jemand Erfahrungen mit JNI und Visual Studio dlls gemacht

Bin für jede Hilfe Dankbar
 
T

tuxedo

Gast
Schau mal mit dem "Depencency Walker" (google -> "depends.exe") auf die DLL drauf. Mir kommts so vor als ob du da abhängigkeiten auf andere/weitere DLLs hast.

- Alex
 

outbreaker

Bekanntes Mitglied
ja genau das denke ich auch das da Abhängigkeiten sind nur ist die frage wie ich die löse bzw wie ich die abhängigen dlls /libs da mit reinbekomme
 
T

tuxedo

Gast
Erstmal schauen ob die vermutung stimmt. Und dann checken ob man die abhängigkeiten nicht gleich in die DLL reingelinkt bekommt.

- Alex
 

thE_29

Top Contributor
Ui!
Visual Studio 2005 (bzw ab 2003) hat irgendwie so ne perverse Einstellung das es auch C/C++ Projekte irgendwie mit C# (eher .net Framework) verknüpft.

Du musst irgendwo in den Linker Einstellungen was umsetzen! Alternativ kannst ja den GCC nehmen oder Visual Studio 6!
 
T

tuxedo

Gast
Ist mir nicht bekannt. Meine DLLs sind in keiner Weise mit dem .net Framework gekoppelt, und ich hab nix umgestellt.

- Alex
 

outbreaker

Bekanntes Mitglied
Ja also es fehlt im diese dll: MSVCR80.dll wenn ich diese dann mit in das Verzeichnis kopieren dann will er diese COREDLL.DLL die finde ich aber nicht um sie dahin zu kopieren.

Ich habe schon VS alles durchgesucht aber nicht gefunden wo man das einstellen kann das er die externen dlls mit reinpackt

Wenn ich in die dll von gcc gucke dann benutzt die nicht die MSVCR80.dll sondern die MSVCRT.DLL und die ist in system32 drin

Kann ich in VS nicht irgendwie sagen das er die MSVCRT nehmen soll und nicht die MSVCR80?
 

outbreaker

Bekanntes Mitglied
So habe mir jetzt die richtige fehlende MSVCR80.dll in mein Eclipse Verzeichnis dazu kopiert
die aus "...\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\"
Nun bringt mir das "depends.exe" Tool keinen Fehler mehr aber beim ausführen meiner Java Anwendung kommt dieser Fehler:
Runtime Error!
Program: D:\Programme\Java\jre1.6.0_05\bin\javaw.exe

R6034
An application has made an attempt to load the C runtime library incorrectly.
Please contact the applications's support team for more information.

Woran könnte das liegen?
doch die falsche dll?
 
T

tuxedo

Gast
Hast du mal nach dem Errorcode gegoogelt?

JNI ist halt so ne Sache. Wenns funktioniert isses toll. Aber wehe irgendwas geht nicht. Da ist man dann wie wild am suchen.

Kannst ja auch mal versuchen das ganze mit VS2005 zu debuggen.

- Alex
 

thE_29

Top Contributor
@alex: ich hab mir mal ne EXE erstellt (C++ Projekt) mit Visual 2003 und diese EXE ging auf System wo KEIN .net FRAMEWORK war nicht starten!

Hab dann wieder MSVC6 genommen ;)
 

thE_29

Top Contributor
Jo, das ist mir schon bewußt!
Aber bisher hatte ich mit dem 2003er nur Probleme ;)

Hab mir mal das 2005er Express installiert.
 

outbreaker

Bekanntes Mitglied
So nun habe ich das Problem gelöst bekommen
Der Fehler sagte folgendes aus:

Fehlermeldung
Eine Anwendung hat versucht, die C-Laufzeitbibliothek zu laden, ohne ein Manifest zu verwenden. Dieses Verfahren für das Laden von Visual C++-DLLs wird nicht unterstützt. Sie müssen die Anwendung ändern, damit beim Erstellen ein Manifest verwendet wird. Weitere Informationen finden Sie in der Produktdokumentation im Thema "Visual C++ Libraries as Shared Side-by-Side Assemblies".

Nun habe ich Visual Studio eingestellt das er die Manifest mit reinpackt und dann geht es auch
Ich muss jetzt noch nicht einmal irgend eine dll mit hinkopieren er packt alles mit rein

Verstehe zwar nicht warum das jetzt geht aber naja ok
hatte nähmlich das mit dem Manifest vorher auch an da ging es nicht dann habe ich es deaktiviert ging es auch nicht und nun wieder aktiviert und nun gehts
Habe vielleicht noch irgend eine andere Einstellung verändert :autsch: das es jetzt geht

Werde nun mal versuchen eine dll aus C++ zu erstellen mal schauen ob das auch so gut geht :roll:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben