开发环境:
Java:IntelliJ IDEA
dll:Visual Studio 2017 Community
1、编写Java类
public class NativeTest {
//通过native关键字,声明一个本地方法
public native void sayHello();
public static void main(String[] args){
System.loadLibrary("HelloWorld"); //"HelloWorld"是之后生成的.dll文件的文件名
NativeTest nativeTest = new NativeTest(); //实例化类对象
nativeTest.sayHello(); //调用本地方法
}
}
2、生成.class文件
在IntelliJ IDEA的Terminal中输入:javac NativeTest.java
此时在\JNITest\src文件下生成了一个NativeTest.class
文件。
3、生成.h头文件
在IntelliJ IDEA的Terminal中输入:javah -jni NativeTest
此时在\JNITest\src文件下生成了一个NativeTest.h
文件,文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativeTest */
#ifndef _Included_NativeTest
#define _Included_NativeTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: NativeTest
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_NativeTest_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
4、编写C代码
通过Visual Studio 2017 Community新建一个项目,选择“动态链接库(DLL)”。
把上一步生成的NativeTest.h
文件复制到项目目录下,
然后在HellowWorld.cpp
文件中输入如下代码:
#include "stdafx.h"
#include "jni.h"
#include "jni_md.h"
#include "jawt_md.h"
#include "NativeTest.h"
JNIEXPORT void JNICALL Java_NativeTest_sayHello(JNIEnv *env, jobject obj) {
printf("Hello World By Visual Studio 2017\n");
}
5、生成.dll文件
可以在Debug或Release文件夹中找到新生成的HelloWorld.dll
文件,将它复制到Java项目的\JNITest\src文件夹中。
6、测试
在IDEA的Terminal中输入:java NativeTest
可以看出成功调用了.dll文件中的函数。
7、可能遇到的问题
- 在第4步include头文件时,可能会报错,可以参考这篇文章。
- 在第6步运行程序时,可能会提示"Can’t load IA 32-bit .dll on a AMD 64-bit platform",原因是生成的.dll文件是32位的,不是64位的,可参考这篇文章。