【问题标题】:JNI -- UnsatisfiedLinkError on native methodJNI - 本机方法上的 UnsatisfiedLinkError
【发布时间】:2012-04-23 02:54:58
【问题描述】:

我正在运行 Windows XP。显然 JNI 和 UnsatisfiedLinkError 齐头并进......我注意到大多数时候,链接器错误看起来像这样:

java.lang.UnsatisfiedLinkError: no whatever.dll in java.library.path

但这不是我的问题; Java 可以找到我的 DLL。我收到一个错误,让我认为我的方法命名错误:

java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(lJava/lang/String;)Z

我尝试在 StackOverflow 上查看许多类似的问题,例如 this onethis onethis onethis onethis one,但这些方法都没有奏效。我还在 Ubuntu 论坛上找到了this thread,它看起来与我遇到的问题完全相同,但提问者没有说明他们如何解决自己的问题(这真的很糟糕)。对此的所有 Google 搜索都给了我一个与 java.library.path 相同的错误。

这是我的实际代码。

NativeTest.java

class NativeTest
    {

    public static native boolean nativemethod (String arg);

    public static void main (String[] args)
        {
        System.out.println(nativemethod("0123456789"));
        System.out.println(nativemethod("012"));
        }

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

    }

NativeTest.h

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

#ifndef _Included_NativeTest
#define _Included_NativeTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     NativeTest
 * Method:    nativemethod
 * Signature: (Ljava/lang/String;)Z
 */
JNIEXPORT jboolean JNICALL Java_NativeTest_nativemethod
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif

NativeTest.c

#include <jni.h>
#include <windows.h>
#include "NativeTest.h"

JNIEXPORT jboolean JNICALL Java_NativeTest_nativemethod
    (JNIEnv* Jenv, jclass Jref, jstring Jarg)
    {
    MessageBox(NULL, "text", "title", MB_OK);
    int len = (*Jenv)->GetStringLength(Jenv, Jarg);
    return (jboolean)(len > 5);
    }

在 cmd.exe 中: (gcc 命令是我在互联网上找到的各种命令的大杂烩。)

>javac NativeTest.java

>javah -jni NativeTest

>gcc -shared -I<jdk_dir>\include -I<jdk_dir>\include\win32 -oNativeTest.dll NativeTest.c -lgdi32

>java -Djava.library.path=. NativeTest
Exception on thread "main" java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(Ljava/lang/String;)Z
        at NativeTest.nativemethod(Native Method)
        at NativeTest.main(NativeTest.java:8)

>java NativeTest
Exception on thread "main" java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(Ljava/lang/String;)Z
        at NativeTest.nativemethod(Native Method)
        at NativeTest.main(NativeTest.java:8)

【问题讨论】:

  • 我没有仔细查看您的代码,但您是否考虑过使用 JNA 代替?这样你就不用担心 JNI 的不友好了。
  • 甚至不知道 JNA 的存在。我会调查的。谢谢:)
  • 你在java代码中使用的包名是什么?
  • @rob 我使用了 JNA(Java Native Access)。它非常有用且灵活!
  • @nuju 很高兴您发现它有帮助!每当您听到有人提到 JNI 或 UnsatisfiedLinkError 时,请务必宣传。 JNI 有它的位置,但 JNA 使用起来几乎没有那么痛苦。

标签: java c java-native-interface unsatisfiedlinkerror


【解决方案1】:

在搞砸并在谷歌上搜索了半天来解决同样的问题后,我发现 GCC 不会生成 JVM 可以解析符号的 DLL。但是可以将正确的命令行参数传递给 GCC,然后它就可以工作了:

请参阅 this MinGW 关于该主题的帖子。需要传递“-D_JNI_IMPLEMENTATION_ -Wl,--kill-at”作为附加标志。不知道是全部都需要还是只需要第一个。

【讨论】:

  • 您先生,值得更多关注。我花了半天时间试图弄清楚。当我看到你的回答时,正要在 SO 上问一个类似的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 2013-04-08
  • 1970-01-01
相关资源
最近更新 更多