gpt4 book ai didi

java - ECLIPSE - 使用 JNI 时出现 java.lang.UnsatisfiedLinkError

转载 作者:行者123 更新时间:2023-12-01 12:39:21 24 4
gpt4 key购买 nike

大家好:我正在 Windows 7 上练习 JNI。我的目标是使用 C 的 API 在 Eclipse 控制台打印一条“Hello world”消息。

我不断得到

线程“main”java.lang.UnsatisfiedLinkError中出现异常:nativeStuff.HelloJNI.sayHello()V
在nativeStuff.HelloJNI.sayHello( native 方法)
在 main.Init.main(Init.java:17)

在我的项目的属性 -> -> jre8 -> native 库位置 -> Edit -> Workspace 我将 nativeStuff 设置为选定的文件夹,因为库 hello.dll 位于其中,但我保留收到关于 UnsatisfiedLinkError 的相同错误。

这是源树:

src(folder):
main(package):
Init.java
nativeStuff(package):
HelloJNI.java
hello.dll
HelloJNI.c
nativeStuff_HelloJNI.h

初始化.java:

public class Init {

public static void main(String[] args) {
System.out.println("Begin");
new HelloJNI().sayHello(); // from the exception above
}
}

HelloJNI.java:

public class HelloJNI {
static {
try {
System.loadLibrary("hello");
} catch(UnsatisfiedLinkError u) { // always from the exception above
u.printStackTrace();
} catch(SecurityException s) {
s.printStackTrace();
}
}
public native void sayHello();
}

nativeStuff_HelloJNI.h:

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

#ifndef _Included_nativeStuff_HelloJNI
#define _Included_nativeStuff_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: nativeStuff_HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_nativeStuff_HelloJNI_sayHello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

和HelloJNI.c:

#include "jni.h"
#include <stdio.h>
#include "nativeStuff_HelloJNI.h"

// Implementation of native method sayHello() of HelloJNI class
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
printf("Hello World!\n");
return;
}

[编辑]:这些是我输入的用于获取文件的命令...

javac HelloJNI.java
javah -jni nativeStuff.HelloJNI
gcc -Wl,--add-stdcall-alias -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.c

最佳答案

System.loadLibrary 用于系统库,通常位于 jre 子文件夹中。如果您想像示例中那样加载本地库,请改用:

System.load("/path/to/your/lib.ext")

参见jre javadoc

<小时/>

最后,错误是:函数名称必须限定为:Java_nativeCode_HelloJNI_sayHello 而不是 .h 和 .c 中的 Java_HelloJNI_sayHello

关于java - ECLIPSE - 使用 JNI 时出现 java.lang.UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25262996/

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