主要步骤
参看博客:
- https://www.cnblogs.com/KingIceMou/p/7239668.html
- https://www.cnblogs.com/HDK2016/p/7226840.html#a224
补充步骤
因为版本有更新,步骤部分有差异。主要有:
1. javah命令更新
因为找不到javah命令,所以将
javah -jni NativeDemo
换成如下命令
javac -h . .\TestNative.java
2. VS创建工程类型
3. VS操作
引用三个库,分别在
\jdk\include\jni.h
\jdk\include\win32\jawt_md.h
\jdk\include\win32\jni_md.h
将头文件由<>改为""
#include “jni.h”
注意补上方法名后的括号
#include "HelloNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloNative_sayHello()
{
printf("Hello,JNI");
}
右击项目,属性->配置属性->…
4. 文件放置于编译
桌面上有TestNative.java、TestNative.class、HelloNative.dll(static方法中的加载库文件名)。
运行时使用
java TestNative.java
很奇怪,平时是
java 类名即可
5. Eclipse下带dll的运行记录
在配置Source->Native library location之后,还需要注意,用于生成dll文件的java文件,要和eclipse上运行的java文件一样,容易出错的地方是包名不同。
如果包名是中文,那么生成的.c文件前面是乱码,所以先修改.c文件名,再生成.dll文件,那么eclipse中的java文件包名也要变的和生成.dll文件的java文件一样。
异常记录
异常一
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\lenovo\Desktop\HelloNative.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:383)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:227)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:169)
at java.base/jdk.internal.loader.NativeLibraries.findFromPaths(NativeLibraries.java:310)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:282)
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2440)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:809)
at java.base/java.lang.System.loadLibrary(System.java:1893)
at TestNative.<clinit>(TestNative.java:7)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:468)
at jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:405)
at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)
解决方案:
异常2
Exception in thread "main" java.lang.UnsatisfiedLinkError: 'void TestNative.sayHello()'
at TestNative.sayHello(Native Method)
at TestNative.main(TestNative.java:21)
目前尚未解决。