“线程中的异常”;“主要”;java.lang.UnsatisfiedLinkError:RunnerClass.parsecmdline(ILjava/lang/String;)V
我有一个测试用例,我试图使用JNI从Java程序访问C代码。涉及的步骤如下:“线程中的异常”;“主要”;java.lang.UnsatisfiedLinkError:RunnerClass.parsecmdline(ILjava/lang/String;)V,java,c,exception,java-native-interface,unsatisfiedlinkerror,Java,C,Exception,Java Native Interface,Unsatisfiedlinkerror,我有一个测试用例,我试图使用JNI从Java程序访问C代码。涉及的步骤如下: 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)
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)
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();
}
}
/* 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
2。现在,在生成.class
文件并从相应的.h
文件创建之后,我在.c
文件中放置了本机方法实现。
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();
}
}
/* 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
我做了很多研究,到目前为止,我理解抛出异常是因为程序无法在正在加载的库中找到本机方法的实现。异常与您的代码不匹配。 在Java中,将函数声明为
public native void win32_svc_install();
JNIEXPORT void JNICALL Java_RunnerClass_win32_1svc_1install (JNIEnv *, jobject);
在C++中,你将函数声明为< /p>
public native void win32_svc_install();
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++函数之一来重现它;以下未满足的链接异常正确说明了定义的参数。函数是什么
parsecmdline()
?看起来本机方法正在尝试调用Java方法,但找不到Java方法。你有本机方法的源代码吗?@millimose:这是个错误。现在已经编辑过了。@Joni:我没有得到ypu的评论?我的JAVA程序有一个本机方法声明,其定义在一个[.c]文件中,该文件在生成后创建一个[.dll]文件。没有本机方法调用java方法。您如何通过命令行或IDE运行应用程序?如何准确设置属性java.library.path
?