我有一个测试用例,我试图使用 JNI 从我的 Java 程序中访问 C 代码。涉及的步骤如下:
1.调用本地方法的Java程序:
public class RunnerClass{
public native void win32_svc_install();
static{
System.loadLibrary("testDll");
System.out.println("library loaded successfully");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new RunnerClass().win32_svc_install();
}
}
2. 现在,在.class
生成文件并从相应的.h
文件创建之后,我将本地方法实现放在.c
文件中。
/* DO NOT EDIT THIS FILE - it is machine generated */
//RunnerClass.h
#include <jni.h>
/* Header for class RunnerClass */
#ifndef _Included_RunnerClass
#define _Included_RunnerClass
#ifdef __cplusplus
extern "C" {
#endif/*
* Class: RunnerClass
* Method: nx_win32_svc_install
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_RunnerClass_win32_1svc_1install
(JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endif
该RunnerClass.c
文件中包含本机方法的实现。该方法的确切作用是调用ServiceManager
windows 来使用它。我的 Java 程序需要执行这些操作。
现在问题出现在testDll.dll
创建之后。在解释 Java 代码之前,我testDll
在java.library.path
.
现在,当我运行我的程序时,我的库被加载,但它抛出UnsatisfiedLinkError
了本地方法。确切的错误如下:
Exception in thread "main" hello ,java.lang.UnsatisfiedLinkError: RunnerClass.win32_svc_install(ILjava/lang/String;)V
at RunnerClass.win32_svc_install(Native Method)
at RunnerClass.main(MainWs.java:58)
我做了很多研究并且到目前为止理解抛出异常是因为程序无法在正在加载的库中找到本机方法的实现。