我在尝试加载库时遇到异常:UnsatisfiedLinkError。我已将库文件放在正确的路径中,并将路径添加到 PATH 环境变量。但似乎没有任何效果。直到我更改了 Tomcat 配置并将 -Djava.library.path=C:\Windows\System32 添加到 java 选项中。我的一位同事不必这样做,但它在她的系统上运行良好,我错过了什么?任何人都可以对此有所了解吗?
2 回答
在 JNI 中,Java 本地方法的名称和对应的 C 函数的名称不同。为了调用 C 函数,C 函数的名称必须包含前缀“Java_”、类名和方法名。简单的方法是使用程序“javah”来生成包含所有定义的头文件。
尝试以下 Windows 示例:(记住 Java 类名必须与相应的文件名相同)
步骤 1. 创建以下 Java 文件 (P.java):
class P
{
static
{
// "P" is the name of DLL without ".dll"
System.loadLibrary ("P");
}
public static native void f(int i);
public static void main(String[] args)
{
f(1);
}
}
步骤 2.javac P.java
步骤 3.javah P
然后,“javah”生成头文件“Ph”
步骤 4. 创建文件“P.def”,包括以下两行(此文件定义导出的符号,在本例中为 C 函数的名称):
EXPORTS
Java_P_f
第 5 步。创建您的 C 文件 (Pc):
#include "p.h"
JNIEXPORT void JNICALL Java_P_f(JNIEnv *env, jclass c, jint i)
{
printf("%i\n",i);
}
步骤 6. 在 Visual Studio 命令提示符中,定义以下变量:
设置 JAVA_HOME= JDK的路径
设置包含=%include%;%JAVA_HOME%\include;%JAVA_HOME%\include\win32
步骤 7. 生成 DLL:
cl /LD Pc P.def
步骤 8. 运行 Java 程序:
爪哇
(注:P.dll 和 P.class 位于同一目录下)
一种选择可能是注册 dll
Regsvr32 “path to your dll.dll”.
这将安装/注册dll(我假设它是一个dll)
但我一般观察到,如果它是 COM dll,那么你必须注册它并将其放入 System32