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 中有 dll 文件名为 IntArray.dll EM>
答案 0 :(得分:0)
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文件中导出,这就是为什么它找不到它。
答案 1 :(得分:0)
您已经在Netbeans项目的elita
forlder下创建了一个文件夹lib
。将.dll复制到该文件夹。现在在NetBeans IDE中,右键单击并选择Project properties-&gt; Run- &gt; VM选项: - Djava.library.path=lib/elita
然后从IDE本身运行您的程序。
答案 2 :(得分:0)
一切都很好!但是你应该尝试一件事。永久删除IDE code :: blocks 创建的各种文件(包括.dll文件)。然后重建你的程序。如果有的话,忽略 MACROS !然后它应该工作。