JNI: UnsatisfiedLinkError

Status
Nicht offen für weitere Antworten.
S

sebastian4gold

Gast
Hey!

Also, ich habe gedacht ich probiere einmal JNI aus. Soweit so gut.
Einfache C Funktion geschrieben, compiliert, fertig.

So nun ausführen:

Code:
Exception in thread "main" java.lang.UnsatisfiedLinkError: soundPC
	at NativeSpeaker.soundPC(Native Method)
	at NativeSpeaker.main(NativeSpeaker.java:17)

TOLL!

Eigentlich habe ich bis jetzt (die letzten 3 Jahre) alles ganz gut alleine gebacken bekommen, aber hier komme ich nicht weiter.

Was mache ich falsch?

Compiler: GCC
Java Version: 1.5

Die Funktion erwartet als Parameter einen Integer, den sie einfach zurückgibt.

Vielen Dank!

Sebastian
 
S

sebastian4gold

Gast
Nein, leider nicht wirklich :(
(Trotzdem TNX)

Vielleicht kann mir jemand helfen, wenn ich den Sourcecode mal poste.


Hier die Hauptklasse (die auch den Fehler ausgibt)
Code:
/*
 * Created on 14.04.2006
 */

/**
 * @author Sebastian
 */
public class NativeSpeaker {
	
	static {
		System.loadLibrary("NativeSpeaker");
	}
	
	public static native int soundPC(int frequency);

	public static void main(String args[]) {
		System.out.println(soundPC(555));
		System.exit(0);
	}
}

Hier die C Funktion (Header poste ich nicht, ist ja eh mit javah gemacht):
Code:
#include <jni.h>
#include "NativeSpeaker.h"

JNIEXPORT jint JNICALL Java_NativeSpeaker_soundPC
  (JNIEnv *env, jclass clazz, jint frequency) {
          
          return frequency;
          }


Und hier der Aufruf des Compilers (gcc):
Code:
gcc -Wall -shared -I D:\Java\jdk1.5.0\include -I D:\Java\jdk1.5.0\include\win32 NativeSpeaker.c -o NativeSpeaker.dll


TNX
Sebastian[/quote]
 
G

Guest

Gast
Ich habe leider haargenau das selbe Problem. Suche auch schon seit einer Ewigkeit nach einer Lösung, habe es aber bisher noch nicht hinbekommen.

Konntest Du das Problem damals lösen? Wenn ja, dann wäre ich für jeden Tipp dankbar.


Gruß
Markus
 
G

Guest

Gast
Murray hat gesagt.:
Die DLL mus sich im Pfad befinden (Umgebungsvariable PATH, **nicht** CLASSPATH).

hab ich schon versucht, hat leider auch nicht geholfen... weiterhin der gleiche fehler...
 
G

Guest

Gast
so, hab es nun schließlich doch noch hinbekommen.
fehlerursache war einzig und allein der verwendete compiler. habe zuerst den gcc benutzt, mit dem hat es nicht funktioniert, dann habe ich den Microsoft C++ compiler verwendet und siehe da: es klappt einwandfrei!
 

thE_29

Top Contributor
Jop!

Habe es auch noch nie mit dem GCC hinbekommen das es läuft..

Man muss den MS Compiler verwenden

Nur unter Linux?!?
 
G

Gast

Gast
Könnte einer bitte mal einen funktionierenden CC Ant-Task posten, der den MSVC als Compiler nutzt um CPP Dateien zu compilieren. Ich beomm das einfach nicht gebacken.

Mit dem GCC klappt zwar die DLL Erstellung, aber trotzdem bekomme ich einen UnsatisfiedLinkError.

Ich weiß wirklich nicht mehr weiter. Ich habe jetzt ein paar Stunden in Google investiert und ich schaffs einfach nicht.

Vielen Dank für eure Hilfe (bin kurz vorm verzweifeln)
 

mefisto

Mitglied
also ich benutze den visual c compiler und das erstellen der dll scheint richtig zu funktionieren...

schein:

denn als test habe ich folgendes c file erstellt:
Code:
#include "jni.h"
#include <stdio.h>
#include <conio.h>
#include "helloWorld.h"

JNIEXPORT void JNICALL Java_helloWorld_callnative(JNIEnv *env,
                                                  jobject obj)
   {
   printf("HelloWorld\n");
   getch();
   return;
}


keine parameter nix total billig...

durchsuch ich nun die dll nach Java_helloWorld_callnative finde ich _Java_helloWorld_callnative_@8
und das kommt mir ja schonmal total merkwuerdig vor
obwohl ja im generiertem c header eindeutig extern "C" steht...

so letztentlich habe ich eine dll erstellen koennen die ein Java_helloWorld_callnative enthaellt.
dennoch kann ich mit meiner java Class nicht draufzugreifen

Code:
package src;

    class helloWorld {
        
        static {
            System.loadLibrary("helloWorld");
          }
          public static native void callnative();

        
    }
Code:
package src;

public class helloWorldDemo {

    public static void main( String[] args)
    {
        
      helloWorld hW = new helloWorld();
      try {
      
          hW.callnative();
      }
      
      catch(UnsatisfiedLinkError s){
          System.out.println(s);
      }
    }

}

ich habe die dll im class-path im path angegeben und sie mit loadLibrary geladen...

Fehler: linkfeher...
 

mefisto

Mitglied
naja sie wird im object helloWorld geladen
und die klasse helloWorldDemo arbeitet dann mit dem object....

ich hatte auch eine andere version von dem ganzen ;)
Code:
package src;

    class helloWorld {
        
        static {
            System.loadLibrary("helloWorld");
          }
          public static native void callnative();

          public static void main(String[] args){
             
              new helloWorld().callnative();
          }
        
    }
 

thE_29

Top Contributor
Aja, mein Fehler!

Dein Fehler ist der hier:

JNIEXPORT void JNICALL Java_helloWorld_callnative(JNIEnv *env,
jobject obj)

Der Kopf hat keine package Deklaration!

Ihr dürft die packages nachträglich NIE ändern!!!

Oder ihr müsst das im C Code nachziehen und neu kompilieren..

Bist der 2te innerhalb von ein paar Tagen der den gleichen "Mist" macht...
 

mefisto

Mitglied
ehm ich weis jetzt nicht genau was du meinst @thE_29
aber sorry ;)

ehm ich zeig dir mal genau meinen problemfall

ich habe die folgende java classe welche native methoden benutzen soll
Code:
package src;

    class helloWorld {
        
        static {
            System.loadLibrary("helloWorld");
          }
          public static native void callnative();

          public static void main(String[] args){
             
              new helloWorld().callnative();
          }
        
    }

daraus muss ich einen c header generieren lassen

mittels javah

Code:
/* 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:    callnative
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_helloWorld_callnative
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif
so mein dazu gehoeriges c file sieht folgender maßen aus:

Code:
#include <jni.h>
#include <stdio.h>
#include "helloWorld.h"

JNIEXPORT void JNICALL Java_helloWorld_callnative(JNIEnv *env,
                                                  jobject obj)
   {
   printf("HelloWorld\n");
   return;
}

so daraus baue ich eine dll okai durchsuche ich die dll finde ich auch eine Java_"Klassenbezeichner"_"methodenbezeichner"


aber ich kann diese dll nicht von meiner halloWelt.java benutzen.....
vielleicht kannst du mal erlaeutern was du mit packages meinst....

denke!
 

mefisto

Mitglied
ah klar i see...

-> JNIEXPORT void JNICALL Java_src_helloWorld_callnative(JNIEnv *env,
jobject obj)

sry irgendwann sieht man sowas nit mehr :bahnhof:

danke!!!

PS nuetzliches forum ihr hab ein neuen member!!!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben