新建java源文件:
public class HelloNative {
static {
System.load("HelloNative");
}
public static native void hellow();
@SuppressWarnings("static-access")
public static void main(String[] args) {
new HelloNative().hellow();
}
}
尝试编译后直接执行:
NativeDemo> javac HelloNative.java
NativeDemo> java HelloNative
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: HelloNative
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.load0(Unknown Source)
at java.lang.System.load(Unknown Source)
at HelloNative.<clinit>(HelloNative.java:4)
NativeDemo>
$ javah -jni HelloNative
生成名为HelloNative.h的C头文件:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: say_hellow
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_say_1hellow
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
注意将自动生成的C头文件中第二行改为: #include “jni.h”
。
把%JAVA_HOME%/include
目录下的jni.h
和%JAVA_HOME%/include/win32
目录下的jni_md.h
两个文件复制到该目录下:
NativeDemo> tree /f
.
HelloNative.h
HelloNative.java
jni.h
jni_md.h
NativeDemo>
编写相应的C实现:
#include "HelloNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloNative_hellow (JNIEnv *env, jclass cl) {
printf("Hello Native!\n I\'m onefine.\n");
}
Windows下利用x64 Native Tools Command Prompt for VS 2019或者x86 Native Tools Command Prompt for VS 2019编译生成dll文件:
NativeDemo> cl -I JAVA_HOME\include -I JAVA_HOME\include\win32 -LD HelloNative.c -FeHelloNative.dll
用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.21.27702.2 版
版权所有(C) Microsoft Corporation。保留所有权利。
HelloNative.c
Microsoft (R) Incremental Linker Version 14.21.27702.2
Copyright (C) Microsoft Corporation. All rights reserved.
/dll
/implib:HelloNative.lib
/out:HelloNative.dll
HelloNative.obj
正在创建库 HelloNative.lib 和对象 HelloNative.exp
NativeDemo>
其中,JAVA_HOME
是含有JDK的目录如C:\Program Files\Java\jdk1.8.0_191,此可以在环境变量中配置,也可以使用绝对路径。
现在,该目录下的文件如下:
NativeDemo> tree /f
.
HelloNative.c
HelloNative.dll
HelloNative.exp
HelloNative.h
HelloNative.java
HelloNative.lib
HelloNative.obj
jni.h
jni_md.h
NativeDemo>
编译Java代码并执行:
NativeDemo> javac HelloNative.java
NativeDemo> java HelloNative
Hello Native!
I'm onefine.
NativeDemo>
采用IDE来完成:Eclipse Java Photon && Visual Studio 2019
Java代码:
public class HelloNative {
static {
// temp_path: /D:/eclipse/javaProject/NativeDemo/bin/
String temp_path = Class.class.getClass().getResource("/").getPath().replace("/", "\\");
System.load(temp_path.substring(1, temp_path.length()-4) + "src\\HelloNative.dll");
}
public static native void say_hellow();
@SuppressWarnings("static-access")
public static void main(String[] args) {
new HelloNative().say_hellow();
}
}
直接运行出现错误:
Exception in thread “main” java.lang.UnsatisfiedLinkError: Can’t load library: D:\eclipse\javaProject\NativeDemo\src\HelloNative.dll
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.load0(Unknown Source)
at java.lang.System.load(Unknown Source)
at HelloNative.(HelloNative.java:6)
VS2019创建C++动态库:
项目右击生成:
其余操作一致。
参考:
自己实现一个Native方法的调用 https://www.cnblogs.com/szlbm/p/5504603.html
VS2017创建C++动态库(DLL) https://blog.csdn.net/any1234567890/article/details/91491073
命令行中 javac、java、javap 的使用详解 https://blog.csdn.net/zhouxukun123/article/details/79121059
在windows下编译java文件、执行 https://jingyan.baidu.com/article/4d58d5412a5fca9dd4e9c025.html