- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个测试用例,我试图使用 JNI 从我的 Java 程序访问 C 代码。涉及的步骤如下:
<强>1。调用 native 方法的 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
来使用它。我的 Java 程序需要执行这些操作。
现在问题出现在 testDll.dll
创建之后。在解释Java代码之前,我在java.library.path
中设置了所需库(testDll
)的库路径。
现在当我运行我的程序时,我的库被加载但它向本地方法抛出 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)
我做了很多研究,到目前为止我明白抛出异常是因为程序无法在正在加载的库中找到 native 方法的实现。
最佳答案
异常确实与您的代码不匹配。在 Java 中,您将函数声明为
public native void win32_svc_install();
在c++中,你将函数声明为
JNIEXPORT void JNICALL Java_RunnerClass_win32_1svc_1install (JNIEnv *, jobject);
我认为应该声明为
JNIEXPORT void JNICALL Java_RunnerClass_win32_svc_install (JNIEnv *, jobject);
但是除了c++声明中奇怪的“1”之外,似乎还有一个问题。这两个函数都被正确声明为具有零参数的 void 函数。
但是您的异常指出,它正在寻找一个同名的 void 函数,但带有一个整数和一个字符串参数:
RunnerClass.win32_svc_install(ILjava/lang/String;)V
在查看您的代码时,我无法想象为什么。我试图通过重命名我的一个 C++ 函数来重现它;以下未满足的链接异常正确说明了定义的参数。
关于java - 异常在线程 "main"java.lang.UnsatisfiedLinkError : RunnerClass. parsecmdline(ILjava/lang/String;)V,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15449573/
为什么我的运行者类找不到我的步骤文件? 我创建了两个具有独特方法等的功能文件,如果我一一执行它们,它们能够找到相关步骤,但在执行主运行器类时不起作用? @RunWith(Cucumber.class)
我有一个测试用例,我试图使用 JNI 从我的 Java 程序访问 C 代码。涉及的步骤如下: 1。调用 native 方法的 Java 程序: public class RunnerClass{
我是一名优秀的程序员,十分优秀!