2010-07-20 70 views
0

我编写了一个Java类,它通过Jni访问C dll中的方法。使用JNI的未经认证的链接器错误

但我在Windows中得到以下错误。

java.lang.UnsatisfiedLinkError: Server.getNetworkDiagram(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

猜测它能够加载库。

另外我从一组常用C文件构建.dll(对于windows)和.so(对于linux) 这适用于.so文件,我不会收到任何错误。

你能帮我一下吗?

如何在此处进行调试?

感谢, 苏达

不能确定它是否是拼错,因为它工作在Linux操作系统。

下面是头文件和Java文件。

========

JNI文件

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class Server */ 

#ifndef _Included_Server 
#define _Included_Server 
#ifdef __cplusplus 
extern "C" { 
#endif 
#undef Server_GETNETWORK 
#define Server_GETNETWORK 1L 
#undef Server_SETLEVEL 
#define Server_SETLEVEL 2L 
/* 
* Class:  Server 
* Method: getNetworkDiagram 
* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 
*/ 
JNIEXPORT jstring JNICALL Java_Server_getNetworkDiagram 
    (JNIEnv *, jobject, jstring, jstring, jstring); 

/* 
* Class:  Server 
* Method: setLevelQuery 
* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;)Z 
*/ 
JNIEXPORT jboolean JNICALL Java_Server_setLevelQuery 
    (JNIEnv *, jobject, jstring, jstring, jstring, jint, jint, jstring); 

#ifdef __cplusplus 
} 
#endif 
#endif 

========= 
Java File 
========= 
public class Server 
{ 
    public native String getNetworkDiagram(String domain, String dest, String secret); 

    public void test() 
    { 
     String domain = "domain1"; 
     String host = "2.2.2.30"; 
     String secret = "test"; 

     System.loadLibrary("libewapi");  
     String result = this.getNetworkDiagram(domain, host, secret);   
    } 

    public static void main(String argv[]) throws Exception 
    {     
     Server server = new Server(); 
     server.test(); 
    } 
} 

回答

0

有你的一个diferent名称引用该库的机会,也许是拼写错误?或者jni.h文件或java类中的两个函数名称都不对应。

你可以在jni.h文件和java本地方法实现中发布函数声明吗?

+0

无法在此处粘贴整个文件。我已在主要帖子中进行了编辑。 感谢您的帮助 – user397348 2010-07-21 01:19:39

+0

一切似乎都没有问题,您可能会得到两个原因的异常: 1.-无法找到DLL文件?它在应用程序根目录中吗? 2.-在C代码文件本身中包含C头文件,您还需要它用于方法定义和C关键字定义。 有时编译器可能会更改方法名称(符号),您可以将库分解以查看符号表,查看是否有任何更改。 你用什么环境在windows上构建库? – jgemedina 2010-07-21 05:52:34

+0

是的。我正在使用Windows 7,我已经将DLL放在C:\ Windows \ SysWOW64目录中 猜测它能够找到并加载DLL。 我试图使用依赖关系walker来反汇编dll。函数名称是相同的。 唯一的问题,我看到它是说,有两个DLL的失踪。它们是GPSVC.dll和IESHIMS.dll 我们使用交叉编译器从Linux机器构建DLL。 这是一个i386-ming编译器。 – user397348 2010-07-21 06:45:36