1

我试图通过 JNI 库调用本机方法,但我得到“java.lang.UnsatisfiedLinkError:” 现在我将描述我所做的步骤。

测试.java

package pkgmain;

    public class test {
        public native static int getDouble(int n);

        static {
            System.loadLibrary("test");
        }

        public static void main(String[] args) {
            for (int n = 1; n <= 20; n++) {
                System.out.println(n + " x 2 = " + getDouble(n));
            }
        }
    }

在 CMD 控制台中,我提示:

javah -classpath . pkgmain.test

我得到生成的 c 头文件“pkgmain_test.h”:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class pkgmain_test */

#ifndef _Included_pkgmain_test
#define _Included_pkgmain_test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     pkgmain_test
 * Method:    getDouble
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_pkgmain_test_getDouble
  (JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif

DLL代码:

#include "pkgmain_test.h"

JNIEXPORT jint JNICALL Java_pkgmain_test_getDouble(JNIEnv *env,
           jclass clz, jint n) {
    return n * 2;
}

然后我使用 Dev C++ 编译代码。到目前为止,一切都很好。然后我将编译的“test.dll”复制到我的项目中并运行它。

获得的结果:

Exception in thread "main" java.lang.UnsatisfiedLinkError: pkgmain.test.getDouble(I)I
    at pkgmain.test.getDouble(Native Method)
    at pkgmain.test.main(test.java:12)

我正在查看许多教程并遵循所有步骤,但最后总是会出现此错误。

我做错了什么?抱歉英语不好,提前致谢。

4

1 回答 1

1

我得到了我的错误解决方案。错误出现在 dll 项目创建中。正确的选项是“in c”,而不是像在捕获中那样的默认选项“in c++”。

在此处输入图像描述

现在它完美地工作了。调试结果:

1 x 2 = 2
2 x 2 = 4
3 x 2 = 6
4 x 2 = 8
5 x 2 = 10
6 x 2 = 12
7 x 2 = 14
8 x 2 = 16
9 x 2 = 18
10 x 2 = 20
11 x 2 = 22
12 x 2 = 24
13 x 2 = 26
14 x 2 = 28
15 x 2 = 30
16 x 2 = 32
17 x 2 = 34
18 x 2 = 36
19 x 2 = 38
20 x 2 = 40

不管怎么说,还是要谢谢你 :)

于 2013-08-01T17:18:46.893 回答