2012-05-08 34 views
7

Mã Java: MãTại sao tôi nhận: 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:

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

Sau đó, tôi chạy lệnh:

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

mà tôi nhận được các ngoại lệ sau:

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) 

Có một dll file có tên IntArray.dll trong thư mục W: \ Elita \ jnitesters \ workspace \ c \ IntArray \ bin \ Debug

+0

bạn có đang chạy bằng IDE không? – UVM

+0

@UNNI có. Netbeans + Code :: Blocks –

Trả lời

0

Mọi thứ đều ổn! Nhưng có một điều bạn nên cố gắng. Xóa vĩnh viễn tất cả các loại tệp (bao gồm tệp .dll) được tạo bởi mã IDE :: khối. Và sau đó xây dựng lại chương trình của bạn. Bỏ qua MACROS nếu có! Sau đó, nó sẽ làm việc.

0

Hmmm, tôi không thể nhìn thấy bất cứ điều gì rõ ràng , nhưng một vài điều để thử:

1) Chỉ định đường dẫn đầy đủ trong System.load() Dấu vết ngăn xếp của bạn hơi khó hiểu rằng nó cho biết sumArray() đang được gọi bởi dòng thứ 17 là tĩnh, vì vậy tôi không ' Tôi không biết phải làm gì.

2) Đặt một khối try/catch xung quanh bạn System.load()

3) Cố gắng xác định phương pháp của bạn như thế này:

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

Có lẽ phương pháp này không được xuất khẩu trong file .dll của bạn đó là lý do nó không tìm thấy nó.

+0

ngay cả khi tôi đưa ra đường dẫn đầy đủ, tôi nhận được ngoại lệ: 'java.lang.UnsatisfiedLinkError: không có W: /elita/jnitesters/workspace/c/IntArray/bin/Debug/IntArray.dll trong java. library.path' –

+0

Bạn nhận được ngoại lệ trong System.load()? Bạn đã thêm thử/nắm bắt xung quanh đó? Điều này có thể chỉ ra sau đó rằng nó không tìm thấy các tập tin .dll ở vị trí đó. Bạn có thể kiểm tra lại xem nó có thực sự ở đó và có thể truy cập không? –

+0

[có nó ở đó và có thể truy cập] (http://i46.tinypic.com/24m9e8j.jpg) –

0

Bạn đã tạo một thư mục elita dưới lib forlder của Netbeans project.Copy bạn .dll của bạn để mà folder.Now trong NetBeans IDE, nhấp chuột phải và chọn Project Properties-> Run-> VM Options: - Djava.library.path=lib/elita

Sau đó chạy chương trình của bạn từ chính IDE.

+0

Tôi cần tạo thư mục lib ở đâu? [Có được không?] (Http://i50.tinypic.com/20fby9.jpg). Đây chỉ là bên trong thư mục dự án netbeans –

+0

Có ... trong thư mục lib tạo thư mục có tên elite và sao chép .dll – UVM

+0

Đường dẫn của bạn vẫn chỉ hiển thị cũ.Thay đổi nó thành lib/elita và thực thi qua IDE. – UVM

Các vấn đề liên quan