【问题标题】:why am i getting : java.lang.UnsatisfiedLinkError为什么我得到:java.lang.UnsatisfiedLinkError
【发布时间】:2012-05-08 05:12:54
【问题描述】:

Java 代码:

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:\elita\jnitesters\workspace\c\IntArray\bin\Debug 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)

W:\elita\jnitesters\workspace\c\IntArray\bin\Debug目录下有一个名为IntArray.dlldll文件 em>

【问题讨论】:

  • @UNNI 是的。 Netbeans + 代码::块

标签: java c++ c java-native-interface unsatisfiedlinkerror


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    嗯,我看不到任何明显的东西,但可以尝试一些事情:

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

    2) 在您的 System.load() 周围放置一个 try/catch 块

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

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

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

    【讨论】:

    • 即使我给出完整路径,我也会得到异常:java.lang.UnsatisfiedLinkError: no W:/elita/jnitesters/workspace/c/IntArray/bin/Debug/IntArray.dll in java.library.path
    • 您在 System.load() 中得到异常?您添加了 try/catch 吗?这可能表明它没有在该位置找到 .dll 文件。你能仔细检查一下它确实存在并且可以访问吗?
    • 您可以使用nirsoft.net/utils/dll_export_viewer.html 来查看您的DLL 是否导出了正确的方法?
    【解决方案3】:

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

    然后从 IDE 本身运行您的程序。

    【讨论】:

    • 我需要在哪里创建 lib 文件夹? Is this ok ?。这只是在 netbeans 项目文件夹中
    • 是的...在lib文件夹下创建一个名为elite的文件夹并复制那个.dll
    • 您的路径仍然只显示旧的。将其更改为 lib/elita 并通过 IDE 执行。
    • 在我通过 netbeans 执行后给出相同的异常
    • 这与运行时手动设置路径有何不同?
    猜你喜欢
    • 1970-01-01
    • 2012-05-17
    • 2021-12-24
    • 2019-12-27
    • 2021-08-04
    • 2019-03-28
    • 2021-03-05
    • 2021-08-27
    • 2021-10-23
    相关资源
    最近更新 更多