2012-05-08 6 views
7

Java-Code:warum bin ich immer: java.lang.UnsatisfiedLinkError

package Package; 

public class IntArray { 
private native int sumArray(int[] arr); 

public static void main(String args[]) { 
    IntArray p = new IntArray(); 
    int arr[] = new int[10]; 
    for(int i=0 ; i<10 ; i++) { 
     arr[i] = i; 
    } 
    int sum = p.sumArray(arr); // pass the array to the c function sumArray 
    System.out.println("Sum is : " + sum); 
} 

static { // 17th statement 
    System.loadLibrary("IntArray"); 
} 
} 

C-Code:

#include<stdio.h> 
#include "Package_IntArray.h" 

jint Java_Package_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr) 
      { 
      jint buf[10]; 
      jint i, sum = 0; 
      (*env)->GetIntArrayRegion(env, arr, 0, 10, buf); 
      for (i = 0; i < 10; i++) { 
       sum += buf[i]; 
      } 
      return sum; 
      } 

Dann laufen i den Befehl:

java -Djava.library.path=W:\elita\jnitesters\workspace\c\IntArray\bin\Debug Package.IntArray 

, auf die ich bekommen die folgenden Ausnahmen:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Package.IntArray.sumArray([I)I 
    at Package.IntArray.sumArray(Native Method) 
    at Package.IntArray.main(IntArray.java:17) 

Es gibt eine dll Datei IntArray.dll namens im Verzeichnis W: \ elita \ jnitesters \ Arbeitsplatz \ c \ IntArray \ bin \ Debug

+0

verwenden Sie IDE? – UVM

+0

@UNNI ja. Netbeans + Code :: Blöcke –

Antwort

0

Alles ist gut! Aber es gibt eine Sache, die du versuchen solltest. Löschen Sie permanent alle Arten von Dateien (einschließlich DLL-Datei), die von der IDE code :: blocks erstellt wurden. Und dann erstellen Sie Ihr Programm neu. Auslassen MAKROS falls vorhanden! Dann sollte es funktionieren.

0

Hmmm, ich nicht offensichtlich nichts sehen kann , aber ein paar Dinge zu versuchen:

1) Geben Sie den vollständigen Pfad in Ihrem System.load() Die Stack-Trace ist ein bisschen verwirrend, dass es angibt, sumArray() von der 17. Zeile, die die statische aufgerufen wird, also ich don ' Ich weiß, was ich davon halten soll.

2) Setzen Sie einen try/catch-Block um den System.load()

3) Versuchen Sie, Ihre Methode wie folgt definieren:

JNIEXPORT void JNICALL Java_Package_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr) 
{ 
    /*Implement Native Method Here*/ 
} 

Vielleicht ist das Verfahren nicht in der DLL-Datei exportiert werden, weshalb es findet es nicht.

+0

auch wenn ich den vollständigen Pfad gebe ich bekomme die Ausnahme: 'java.lang.UnsatisfiedLinkError: nein W: /elita/jnitesters/workspace/c/IntArray/bin/Debug/IntArray.dll in Java. library.path' –

+0

Sie erhalten die Ausnahme in der System.load()? Du hast den Versuch/Fang um das hinzugefügt? Das zeigt dann wahrscheinlich an, dass es die DLL-Datei an diesem Speicherort nicht findet. Können Sie überprüfen, ob es tatsächlich vorhanden und zugänglich ist? –

+0

[ja es ist da und ist zugänglich] (http://i46.tinypic.com/24m9e8j.jpg) –

0

Sie haben bereits einen Ordner elita unter lib forlder Ihrer Netbeans project.Copy Ihre DLL zu diesem folder.Now in NetBeans IDE mit der rechten Maustaste und wählen Projekt Eigenschaften- erstellt> Run-> VM Optionen: - Djava.library.path=lib/elita

Dann führen Sie Ihr Programm von der IDE selbst.

+0

Wo muss ich den lib-Ordner erstellen? [Ist das in Ordnung?] (Http://i50.tinypic.com/20fby9.jpg). Dies war nur in der netbeans Projektordner –

+0

Ja ... unter dem Ordner lib erstellen Sie einen Ordner namens Elite und kopieren Sie das. Dll – UVM

+0

Ihr Pfad zeigt immer noch nur alt.Ändern Sie es in lib/elita und führen Sie über eine IDE. – UVM