Java中Native方法使用记录(VS2019编译c代码成.dll文件,并加入java中作为native方法)

主要步骤

参看博客:

  1. https://www.cnblogs.com/KingIceMou/p/7239668.html
  2. https://www.cnblogs.com/HDK2016/p/7226840.html#a224

补充步骤

因为版本有更新,步骤部分有差异。主要有:

1. javah命令更新

因为找不到javah命令,所以将

javah -jni NativeDemo

换成如下命令

javac -h . .\TestNative.java

2. VS创建工程类型

为java创建dll文件的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");
}

右击项目,属性->配置属性->…
取消VS预编译头位置

4. 文件放置于编译

桌面上有TestNative.java、TestNative.class、HelloNative.dll(static方法中的加载库文件名)。
运行时使用

java TestNative.java

很奇怪,平时是

java 类名即可

java nativedemo运行结果

5. Eclipse下带dll的运行记录

在配置Source->Native library location之后,还需要注意,用于生成dll文件的java文件,要和eclipse上运行的java文件一样,容易出错的地方是包名不同。
如果包名是中文,那么生成的.c文件前面是乱码,所以先修改.c文件名,再生成.dll文件,那么eclipse中的java文件包名也要变的和生成.dll文件的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)

目前尚未解决。

参考

  1. 博客园.Java中Native关键字的作用
  2. CSDN.java调用vs2013编写的dll动态库
  3. CSDN.VS2017出现“是否忘记了向源中添加”#include"pch.h""
  4. Eclipse中java项目调用DLL
  5. java调用dll,报java.lang.UnsatisfiedLinkError错的解决办法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值