windows java jni调用dll
- 编写带有native声明的方法的java类,生成.java文件
- 使用javac命令编译所编写的java类,生成.class文件
- 使用javah -jni java类名生成扩展名为h的头文件,也即生成.h文件
- 使用C/C++(或者其他编程想语言)实现本地方法,创建.h文件的实现,也就是创建.cpp文件实现.h文件中的方法
- 将C/C++编写的文件生成动态连接库,生成dll文件
public class HelloJni {
native void hello();
static {
System.loadLibrary("HelloJni");
}
public static void main(String args[]) {
HelloJni helloJni = new HelloJni();
helloJni.hello();
}
}
cmd进入到HelloJni.java文件夹,然后执行javah -jni java HelloJni命令 生成HelloJni .h头文件。
#ifndef _Included_HelloJni
#define _Included_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJni
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJni_hello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
然后在vs2017建立一个空项目,导入头文件,同时把这个文件复制到项目所在文件夹。
执行编译,这时可能会报错,提示jni.h找不到,需要将jni.h所在的文件加入到项目的包含目录中。可以在项目中点右键->属性,然后参照下面的图添加。
然后添加一个主程序
#include "HelloJni.h"
#include <stdio.h>
#include <jni.h>
/*
* Class: HelloJni
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJni_hello
(JNIEnv * env, jobject)
{
printf("Hello Jni!\n");
return;
}
改成dll然后生成解决方案。
把这个文件copy到C:\Windows\System32 和java项目下就可以了。只是会报Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Windows\System32\HelloJni.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform 应该是这只能生成32位的dll我们64位的平台无法调用。不过大概过程就是这样了。