我正在尝试编写一个简单的 Java 程序,该程序通过 JNI 调用 C 函数来打印“Hello World”。一切都编译没有错误,但是当我运行程序时,我得到一个“UnsatisfiedLinkError:找不到依赖库”。
根据 Dependency Walker 和 dumpbin,唯一的依赖项是“kernel32.dll”,位于 C:\Windows\System32 及其依赖项中,也在 System32 中。
打电话
System.loadLibrary("Kernel32");
返回没有错误,但加载包含打印功能的 Hello.dll 仍然会引发错误。
有谁知道这可能是什么原因造成的?
编辑:
Dependency Walker 确实给出了两个警告/错误:
-错误:由于隐式依赖模块中缺少导出函数,至少一个模块具有未解析的导入。
-错误:发现具有不同 CPU 类型的模块。
编辑:
以下是更多细节:我正在运行 Windows 7 64 位,并使用 cl (Visual Studio 2010) 编译我的 .dll。
我的 Java 代码 Hello.java:
public class Hello
{
public static native void hello();
public static void main(String[] args)
{
hello();
}
static
{
// Extra dependencies load with no error
System.loadLibrary("NTDLL");
System.loadLibrary("KERNELBASE");
System.loadLibrary("KERNEL32");
System.loadLibrary("Hello"); // Throws UnsatisfiedLinkError
}
}
我可以毫无错误地编译 java 文件,并使用 javah -jni 生成 C 头文件 Hello.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */
#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hello_hello
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
我在 Hello.c 中实现了标头:
#include <stdio.h>
#include <jni.h>
#include "Hello.h"
#pragma comment(linker, "/EXPORT:Java_Hello_hello=_Java_Hello_hello@8")
JNIEXPORT void JNICALL
Java_Hello_hello(JNIEnv* env, jclass class)
{
printf("Hello World\n");
return;
}
C 代码用 cl(虽然我也尝试过 tcc)编译成 Hello.dll,它与 java .class 存储在同一目录中