【发布时间】:2016-10-18 23:51:26
【问题描述】:
我第一次尝试使用 JNI,但是当我运行我的 java 程序时,我不断收到UnsatisfiedLinkError。该错误说它找不到我的依赖库。我确实看到了JNI Hello World Unsatisfied Link Error 的问题,但他们的建议不起作用。作为旁注,我没有 Microsoft Visual Studio,我在 Windows 10 上运行。
我正在使用以下命令来编译和运行我的程序:
javac HelloWorld.java
javah HelloWorld
gcc -Wl,--add-stdcall-alias -I"C:/Program Files/Java/jdk1.8.0_91/include" -I"C:/Program Files/Java/jdk1.8.0_91/include/win32" -shared -o HelloWorld.dll HelloWorld.c
java -Djava.library.path=. HelloWorld
源代码:
Java 源代码 (HelloWorld.java):
public class HelloWorld {
static {
System.loadLibrary("HelloWorld");
}
private static native void sayHello();
public static void main(String[] args) {
sayHello();
}
}
生成的头文件(HelloWorld.h):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_sayHello
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
C 文件(HelloWorld.c):
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_sayHello(JNIEnv *env, jclass cls) {
printf("C says hello!");
}
【问题讨论】:
-
解决方案是确保依赖库通过 PATH 可用。
-
路径是指环境变量还是命令本身?
-
您确定 JRE 和库具有相同的架构(32/64 位)吗?
标签: java c java-native-interface