为什么我得到:java.lang.UnsatisfiedLinkError

why am i getting : java.lang.UnsatisfiedLinkError

本文关键字:java lang UnsatisfiedLinkError 为什么      更新时间:2023-10-16

Java Code :

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

然后我运行命令:

java -Djava.library.path=W:elitajnitestersworkspacecIntArraybinDebug Package.IntArray

我得到以下例外:

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)

有一个名为 IntArraydll 文件.dll 在目录 W:\elita\jnitesters\workspace\c\IntArray\bin\Debug

一切都很好!但是有一件事你应该尝试。永久删除由IDE代码::blocks创建的各种文件(包括.dll文件)。然后重新生成程序。省略(如果有)!那么它应该可以工作。

嗯,我看不到任何明显的东西,但有几件事可以尝试:

1)在System.load()中指定完整路径 堆栈跟踪有点令人困惑,它指示 sumArray() 被第 17 行调用,这是静态的,所以我不知道该怎么做。

2)在你的System.load()周围放一个尝试/捕获块

3)尝试像这样定义你的方法:

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

也许该方法未导出到您的.dll文件中,这就是找不到它的原因。

您已经在 Netbeans 项目的 lib 下创建了一个文件夹elita。将您的.dll复制到该文件夹。现在,在 NetBeans IDE 中,右键单击并选择"项目属性"->"运行>VM 选项:- Djava.library.path=lib/elita

然后从 IDE 本身运行程序。

相关文章: