Java JNI—本机方法上的UnsatifiedLinkError

Java JNI—本机方法上的UnsatifiedLinkError,java,c,java-native-interface,unsatisfiedlinkerror,Java,C,Java Native Interface,Unsatisfiedlinkerror,我正在运行Windows XP。显然JNI和不满意的链接错误是齐头并进的。。。我注意到,大多数情况下,链接器错误如下所示: java.lang.UnsatisfiedLinkError: no whatever.dll in java.library.path 但这不是我的问题;Java可以找到我的DLL。我遇到一个错误,使我认为我的方法命名错误: java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(lJava/lang/String

我正在运行Windows XP。显然JNI和不满意的链接错误是齐头并进的。。。我注意到,大多数情况下,链接器错误如下所示:

java.lang.UnsatisfiedLinkError: no whatever.dll in java.library.path
但这不是我的问题;Java可以找到我的DLL。我遇到一个错误,使我认为我的方法命名错误:

java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(lJava/lang/String;)Z
我试着研究了许多关于StackOverflow的类似问题,如、、和,但这些方法都不起作用。我也在Ubuntu论坛上发现,它看起来和我遇到的问题完全一样,但提问者没有说他们是如何解决自己的问题的(这真的很糟糕)。所有谷歌搜索都给了我一个与java.library.path-one相同的错误

这是我的实际代码

NativeTest.java

本地测试

/*不要编辑此文件-它是机器生成的*/
#包括
/*类NativeTest的头*/
#ifndef(包括国家测试)
#定义_包含_本地测试
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*类别:本地测试
*方法:nativemethod
*签名:(Ljava/lang/String;)Z
*/
JNIEXPORT jboolean JNICALL Java_NativeTest_nativemethod
(JNIEnv*,jclass,jstring);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫
NativeTest.c

#包括
#包括
#包括“NativeTest.h”
JNIEXPORT jboolean JNICALL Java_NativeTest_nativemethod
(JNIEnv*Jenv,jclass-Jref,jstring-Jarg)
{
消息框(空,“文本”,“标题”,MB_OK);
int len=(*Jenv)->GetStringLength(Jenv,Jarg);
返回(jboolean)(len>5);
}
在cmd.exe中: (gcc命令是我在互联网上找到的各种命令的大杂烩。)

>javac NativeTest.java
>javah-jni NativeTest
>gcc-shared-I\include-I\include\win32-oNativeTest.dll NativeTest.c-lgdi32
>java-Djava.library.path=。本地测试
线程“main”java.lang.UnsatisfiedLinkError上出现异常:NativeTest.nativemethod(Ljava/lang/String;)Z
在NativeTest.nativemethod(本机方法)
在NativeTest.main(NativeTest.java:8)
>java本地测试
线程“main”java.lang.UnsatisfiedLinkError上出现异常:NativeTest.nativemethod(Ljava/lang/String;)Z
在NativeTest.nativemethod(本机方法)
在NativeTest.main(NativeTest.java:8)

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


见关于这个主题的帖子。您需要将“-D_JNI_实现“-Wl,--kill at”作为附加标志传递。我不知道是需要全部还是只需要第一部分。

我没有仔细查看您的代码,但是您是否考虑过使用JNA?那你就不用担心JNI的不友好了,甚至都不知道JNA的存在。我会调查的。谢谢:)您在java代码中使用的包名是什么?@rob我使用了JNA(java原生访问)。这是非常有用和灵活的@nuju很高兴你发现它很有用!当你听到有人提到JNI或不满意的链接错误时,一定要传播这个词。JNI有它的位置,但是JNA使用起来并不那么痛苦。先生,你应该得到更多的关注。我花了半天时间想弄明白。当我看到你的答案时,我正要问一个类似的问题。
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"); }

    }
/* 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
#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);
    }
>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)