java调用dll方法详解

本文详细分析了Java调用DLL过程中遇到的常见问题,包括找不到/无法加载DLL(UnsatisfiedLinkError)、找不到方法、C/C++编译器找不到JNI头文件以及JVM与DLL版本冲突。提供了从设置路径、解决找不到方法到处理编译器头文件问题的解决方案,强调正确加载和方法调用的重要性。
摘要由CSDN通过智能技术生成

前言:

初学java调用dll库时,经常出现无法加载库、找不到方法等错误(UnsatisfiedLinkError等)。本文对常见的问题进行详细的分析,给出较为完整的解决方案。

正文:

在java中写一个native方法,实现对dll的调用,一般过程如下:

public class Native {
	static native void say(String src);
	static{
		System.loadLibrary("libname");
	}
}

然后,用javah 命令生成头文件,得到:

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

#ifndef _Included_Native
#define _Included_Native
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Native
 * Method:    say
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_Native_say
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif

创建C项目(Eclipse平台),将上述的头文件拷贝过来,再写一个.c或者.cpp的文件来实现原生方法

#include "native.h"
JNIEXPORT void JNICALL Java_Native_say(JNIEnv* env, jclass clz, jstring src){
	//....
}

build,得到dll文件,改成name.dll,放到java项目下即可。

经过以上方法,运气好的话,可能一次就成了。但也常见以下错误,我将其分为3类:

A类错误,找不到/无法加载dll文件:

0.java.lang.UnsatisfiedLinkError: no XXX  in java.library.path

1.java.lang.UnsatisfiedLinkError: Can't load library

2.UnsatisfiedLinkError: XXXXXXX 不是有效的 Win32 应用程序。

B类错误,在所有成功加载的dll文件中,找不到要调用的方法:

0.java.lang.UnsatisfiedLinkError:  Native.say(Ljava/lang/String;)V

C类错误,C.C/C++编译器找不到/无法解析jni.h头文件:

0.#include <jni.h>这里提示找不到头文件,以及方法声明那里提示语法错误。

D类错误,jvm版本与dll冲突:

0.ava.lang.UnsatisfiedLinkError:Can't load IA 32-bit .dll on a AMD 64-bit platform。这类错误好理解,就是32位jvm用了64位dll,或者反过来。也比较容易解决,通常换一个对应版本的dll就可以;或者换jdk版本,但比较麻烦。

以上4类问题,D类由于解决起来较为简单,不再讲解。

C类:C.C/C++编译器找不到/无法解析jni.h头文件

这类错误不属于我们代码编写问题,是编译平台的问题。只要能让编译平台知道去哪里找这个头文件就可以。eclipse的话,如果以mingw为C编译器,比较好的解决办法就是,把jdk目录下,include/jni.h和include/win32/jni_md.h放到mingw文件夹下,mingw版本号那个文件夹里的include中,比如我的目录是:D:\Cbianyi\mingw64\x86_64-w64-mingw32\include。如果是用VS6,可以在下图的位置添加jdk的上述目录:

如果是VS2017,设置include目录即可。个人推荐写C代码还是用VS的好,VS6也比eclipse要方便。<

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值