2012-05-08 11 views
7

जावा कोड:मैं क्यों हो रही हूँ: 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"); 
} 
} 

सी कोड:

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

को जो मैं मिलता है:

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

तब मैं आदेश चला निम्नलिखित अपवाद:

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) 

एक dllIntArray.dll निर्देशिका डब्ल्यू में नाम की फ़ाइल नहीं है: \ Elita \ jnitesters \ कार्यक्षेत्र \ ग \ IntArray \ बिन \ डीबग

+0

क्या आप आईडीई का उपयोग कर चल रहे हैं? – UVM

+0

@UNNI हां। नेटबीन्स + कोड :: ब्लॉक –

उत्तर

0

सबकुछ ठीक है! लेकिन एक चीज आपको कोशिश करनी चाहिए। IDE कोड :: ब्लॉक द्वारा बनाई गई सभी प्रकार की फ़ाइलों (.dll फ़ाइल सहित) को स्थायी रूप से हटाएं। और फिर अपने कार्यक्रम का पुनर्निर्माण करें। मैक्रोज़ छोड़ दें यदि कोई हो! फिर यह काम करना चाहिए।

0

हममम, मैं नहीं स्पष्ट कुछ भी देख सकते हैं , लेकिन कोशिश करने के लिए कुछ चीजें:

1) अपने System.load() में पूरा पथ निर्दिष्ट करें स्टैक ट्रेस थोड़ा उलझन में है कि यह 17 वीं रेखा द्वारा स्थिर सम्रा() को इंगित कर रहा है जो स्थिर है, इसलिए मैं नहीं हूं ' टी को पता नहीं है कि क्या करना है।

2) के चारों ओर एक आज़माएं/कैच ब्लॉक रखो अपने System.load()

3) इस तरह से अपनी विधि को परिभाषित करने का प्रयास करें:

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

हो सकता है कि विधि अपने .dll फ़ाइल में निर्यात नहीं किया जा रहा है जिसके कारण यह नहीं मिल रहा है।

+0

जब भी मैं पूरा पथ देता हूं तो मुझे अपवाद मिलता है: 'java.lang.UnsisfisfiedLinkError: no W: /elita/jnitesters/workspace/c/IntArray/bin/Debug/IntArray.dll जावा में। library.path' –

+0

आपको System.load() में अपवाद मिलता है? आपने उस चारों ओर कोशिश/पकड़ जोड़ा? यह शायद इंगित करता है कि उस स्थान पर .dll फ़ाइल नहीं मिल रही है। क्या आप दोबारा जांच सकते हैं कि यह वास्तव में और सुलभ है? –

+0

[हाँ यह वहां है और पहुंच योग्य है] (http://i46.tinypic.com/24m9e8j.jpg) –

0

आप पहले से ही अपने Netbeans project.Copy की lib forlder के तहत एक फ़ोल्डर elita बनाया है NetBeans IDE में है कि folder.Now करने के लिए अपने .dll, राइट क्लिक करें और परियोजना गुण> Run-> वी एम विकल्प का चयन करें: - Djava.library.path=lib/elita

फिर अपना प्रोग्राम आईडीई से चलाएं।

+0

मुझे lib फ़ोल्डर बनाने की आवश्यकता है? [क्या यह ठीक है?] (Http://i50.tinypic.com/20fby9.jpg)। यह सिर्फ netbeans प्रोजेक्ट फ़ोल्डर –

+0

हाँ के अंदर था ... lib फ़ोल्डर के तहत एलिट नामक फ़ोल्डर बनाते हैं और उस प्रतिलिपि को कॉपी करते हैं .dll – UVM

+0

आपका पथ अभी भी पुराना दिखाता है। इसे lib/elita में बदलें और आईडीई के माध्यम से निष्पादित करें। – UVM