2012-05-08 36 views
7

Java Kodu:neden ben alıyorum duyuyorum: 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 kodu:

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

i almak için:

#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; 
      } 

Sonra ben komutunu çalıştırın Aşağıdaki istisnalar:

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) 

dizin W IntArray.dlladında bir dll dosyası yok: \ elita \ jnitesters \ workspace \ c \ IntArray \ bin \ Debug

+0

IDE kullanıyor musunuz? – UVM

+0

@UNNI evet. Netbeans + Code :: Bloklar –

cevap

0

Herşey yolunda! Ama denemeniz gereken bir şey var. IDE kodu :: blokları tarafından oluşturulan tüm dosyaları (.dll dosyası dahil) kalıcı olarak silin. Ve sonra programınızı yeniden oluşturun. Varsa MACROS'u gönderin! O zaman işe yaramalı.

0

Hmmm, ben bariz bir şey göremiyorum Ancak, denemek için birkaç şey:

1) System.load() öğenizdeki tam yolu belirtin Yığın izi, sumArray() öğesinin statik olan 17 satırında çağrıldığını belirten biraz kafa karıştırıcıdır, bu yüzden ben don ' Bunun ne yapılacağını biliyorum.

2) etrafında bir deneme/yakalama bloğu koyun senin System.load()

3) böyle yönteminizi tanımlayan deneyin:

Belki yöntem .dll dosyasında ihraç edilen değil
JNIEXPORT void JNICALL Java_Package_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr) 
{ 
    /*Implement Native Method Here*/ 
} 

neden olan bu onu bulamıyor. Djava.library.path=lib/elita

-: Zaten NetBeans IDE o folder.Now için .dll sağ Proje özellikleri-> Run> VM Seçenekler'i nü, Netbeans project.Copy ait lib forlder altında bir klasör elita yarattık
+0

tam yolunu verdiğimde bile ben istisna: 'java.lang.UnsatisfiedLinkError: hayır W: /elita/jnitesters/workspace/c/IntArray/bin/Debug/IntArray.dll java. library.path' –

+0

Özel durum System.load() 'da olsun? Deneme/yakalamayı buna ekledin mi? Bu muhtemelen, o konumda .dll dosyasını bulamadığını gösterir. Gerçekten orada olduğunu ve erişilebilir olduğunu kontrol edebilir misin? –

+0

[evet var ve erişilebilir] (http://i46.tinypic.com/24m9e8j.jpg) –

0

Programınızı IDE'nin kendisinden çalıştırın.

+0

lib klasörünü nerede oluşturmalıyım? [Bu tamam mı?] (Http://i50.tinypic.com/20fby9.jpg). Bu netbeans proje klasörü –

+0

içinde sadece Evet ... lib klasörü altında elit adlı bir klasör oluşturun ve bu kopyalayın .dll – UVM

+0

Yolunuz hala sadece eski gösterir.O lib/elita için değiştirin ve bir IDE ile çalıştırın. – UVM

İlgili konular