gpt4 book ai didi

java - JNI -- native 方法上的 UnsatisfiedLinkError

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:45 26 4
gpt4 key购买 nike

我运行的是 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)

最佳答案

为了解决同样的问题折腾了半天,我发现 GCC 并没有生成 JVM 可以解析符号的 DLL。但是可以将正确的命令行参数传递给 GCC,然后它就可以工作了:

参见 this MinGW发布主题。需要传递“-D_JNI_IMPLEMENTATION_ -Wl,--kill-at”作为附加标志。不知道是需要所有这些还是只需要第一个。

关于java - JNI -- native 方法上的 UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10274278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com