需要的文件:
一个java文件:SayHello.java
内容:
public class SayHello{
public native void sayHello();
static {
System.loadLibrary("hellodll");
}
public static void main(String[]args){
new SayHello().sayHello();
}
}
一个C/C++文件
内容:
#include <stdio.h>
#include "jni.h"
#include "SayHello.h"
JNIEXPORT void JNICALL Java_SayHello_sayHello(JNIEnv *a, jobject b){
printf("helloworld");
}
其他文件
复制过来的
jni.h位置:C:\Program Files\Java\jdk-9.0.1\include
jni_md.h位置:C:\Program Files\Java\jdk-9.0.1\include\win32
自动生成的
hellodll.dll
SayHello.class
所有文件:
E:\NotePadPP\JNI 的目录
2017/12/05 20:33 <DIR> .
2017/12/05 20:33 <DIR> ..
2017/12/05 20:24 15,872 hellodll.dll
2017/11/20 11:13 73,955 jni.h
2017/11/20 11:13 485 jni_md.h
2017/12/05 20:23 452 SayHello.class
2017/12/05 20:23 394 SayHello.h
2017/12/05 20:21 192 SayHello.java
2017/12/05 20:24 161 TestHello.c
7 个文件 91,511 字节
2 个目录 68,734,390,272 可用字节
步骤:
1:新建SayHello.java文件
2:编译SayHello.java文件
命令javac SayHello.java 此时在文件夹下会产生SayHello.class文件
3:使用命令javah产生一个和java文件同名的头文件,
命令javah SayHello此时在文件夹下回产生一个SayHello.h文件
因为jni.h文件在同一个文件夹下所有需要把#include<jni.h>
改为#include"jni.h"
内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class SayHello */
#ifndef _Included_SayHello
#define _Included_SayHello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: SayHello
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_SayHello_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
4:新建TestHello.c文件
内容是:
#include <stdio.h>
#include "jni.h"
#include "SayHello.h"
JNIEXPORT void JNICALL Java_SayHello_sayHello
(JNIEnv *a, jobject b){
printf("helloworld");
}
5:使用命令:g++ -shared -Wl,-kill-at -s -o hellodll.dll TestHello.c
产生一个dll文件,文件名称是hellodll.dll
此时在文件夹下回多出一个hellodll.dll文件
参数 | 含义 |
---|---|
-shared | 编译成.dll库文件 |
-s | 减小dll文件的大小 |
-o | 目标文件名 |
-Wl,–kill-at | 防止编译后的函数名被自动加上@符号,并取消警告。 |
6:java SayHello
输出helloworld