我正在运行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 one,this one,this one,this one和this one,但没有这些方法都奏效了。我还在Ubuntu论坛上找到了this thread,看起来我遇到了完全相同的问题,但提问者没有说他们如何解决自己的问题(这真的很糟糕)。所有谷歌搜索都给了我一个与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)
答案 0 :(得分:4)
在一天半的时间里乱搞并谷歌搜索同样的问题之后,我发现GCC不会生成JVM可以解析符号的DLL。但是可以将正确的命令行args传递给GCC然后它可以工作:
请参阅有关该主题的this MinGW帖子。需要传递“-D_JNI_IMPLEMENTATION_ -Wl, - kill-at”作为附加标志。不知道是否需要所有这些或只是第一位。