本文使用的开发环境:
- vs2008
- idea 64位
- jdk 1.8 64位
1.在idea里创建一个空项目,创建测试类
public class JniTest {
public native void voidPrintTest();
public static void main(String[] args){
System.loadLibrary("jniLibrary");
JniTest jniDemo = new JniTest();
jniDemo.voidPrintTest();
}
}
2.编译生成class文件,找到class文件的路径
3.找到javah.exe路径 ,注意,javah版本需要与idea中使用的一样,(如果只装了一个版本的java且添加到了环境变量,则不需要)
4.命令行里输入 命令
//[]中的为可选项,classpath 指定class所在目录路径,-d 指定输出目录。
//如果不指定这两项,默认都是命令行当前目录(所以最好直接cd进class所在目录)
javah [-classpath class所在目录的绝对路径] [-d 输出文件的路径] -jni JniTest
示例:
5.执行完上条命令之后就会生成一个.h文件
这是用于编译c++ 动态库所需的头文件,内容如下所示
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniTest */
#ifndef _Included_JniTest
#define _Included_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JniTest
* Method: voidPrintTest
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_JniTest_voidPrintTest
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
6.使用vs创建一个空的dll项目
7.添加头文件引用地址,前两个是jni目录(注意jdk版本要与idea中项目的一致),第三个是第5步生成的JniTest.h的目录
8.创建新cpp文件,添加JniTest.h到项目中,直接编译,可以直接成功,编译失败说明上一步目录配置错误。![在这里插入图片描述](https://img-blog.csdnimg.cn/20210305121822990.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4Nzc3NjI0,size_16,color_FFFFFF,t_70)
9.实现voidPrintTest函数
//func_Imp.cpp
#include <jni.h>
#include "JniTest.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_JniTest_voidPrintTest
(JNIEnv *, jobject){
printf("hello");
return;
}
10.编译动态库,值得注意的是,如果idea使用的jdk是64位的,则需要编译64位的dll
11.编译成功后,转到idea,菜单栏 Run -> Edit Configurations ->Templates->Application->VM options 添加第10步编译出的dll目录到iada项目中
12.运行成功
运行成功,但是输出顺序跟想象中不太一样,dll中的print总在最后打印。