- 一、JNI简介
- 二、个人尝试遇到的问题
- 三、具体操作
- 1.准备的工具
- 2.创建Java项目
- 3.使用VS2022创建动态链接库工程
- 后话
使用JNI的步骤如下:
1.编写.java文件,需要使用本地语言实现的方法,添加native关键字,并且不需要实现(不在.java文件中实现)。
2.使用javac工具,编译.java文件,生成.class文件。
3.使用javah工具,生成.h头文件。
4.新建与.h文件对应的.cpp文件,实现.h文件中的函数。
5.编译.cpp文件 ,生成动态链接库文件(Windows下为dll文件,Linux下位so文件)
6.联合.class文件,使用java工具运行。
二、个人尝试遇到的问题首先我是在网上搜了一些教程,大致方法都有但是总是会遇到不同的问题
1.javah报错找不到类文件
2.gcc编译报错
3.gcc编译出来的文件是32为,无法运行
这些问题和是否使用Java IDE有关,和建的什么Java项目也有关(带来的文件路径变化),和操作系统可能也有关(部分教程可能是在Linux下操作?)
我好不容易到最后一步,搞出来了dll,报错Can’t load IA 32-bit .dll on a AMD 64-bit platform,最后找到了一个比较不错的教程,全程就用IDE来完成,减少人为失误。
三、具体操作 1.准备的工具- IDEA(我用的是2022.1)
- Visual Studio(我用的vs2022)
- jdk(我用的1.8)
- 创建一个名称为JNI_Demo的项目即可,注意不要创建Maven项目
- 在src目录创建一个HelloWorld.java
public class HelloWorld {
public native void showHelloWorld();
static {
System.out.println(System.getProperty("user.dir"));
System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("HelloWorld");
}
public static void main(String[] args) {
new HelloWorld().showHelloWorld();
}
}
- 直接运行,这时候会报错,但是没关系,我们要的是 System.out.println(System.getProperty(“user.dir”)); 输出的路径,后面会用到。
- 右键选中HelloWorld.java,选择->Open In->Terminal
- 输入javah HelloWorld后回车,会生成一个HelloWorld.h文件
- 点击下一步,项目名称也叫HelloWorld
- 右键有文件,选择->添加->现有项,然后找到刚才生成的HelloWorld.h文件添加进来
- 在源文件中新建项目HelloWorld.cpp,代码如下
#include "pch.h" #include "HelloWorld.h" #includeJNIEXPORT void JNICALL Java_HelloWorld_showHelloWorld (JNIEnv*, jobject) { printf("Hello World i`m C++"); }
- 这边选择x64
- 右键项目HelloWorld,选择属性
- 常规中第一个输出目录需要设置,路径为Java项目中 System.out.println(System.getProperty(“user.dir”)); 输出的路径
- C/C++的常规中也需要设置
- 选择编辑
- 选择此处新建路径
- 点击这三个点,选择路径
- 这边一共需要添加三个路径
- jdk的include路径
- ldk的includewin32路径
- HelloWorld.h的路径
- 然后右键项目点击生成,Java项目下会多出如下文件
- 此时在运行HelloWorld.java文件可以正常输出不报错
这只是我参考别人博客后,成功运行的记录,其实关键的两步是
- 用.java文件生成.h文件
- 用这个.h文件+.cpp文件+jdkincludewin32中两个.h文件生成dll文件
其他的方法也可以尝试,这个方法虽然相对简单,但是先跑出来,才有兴趣继续往下研究
这只是一个简单的Demo,其他的知识可以参考官方文档
中文翻译可以百度"JNI-API完全手册"。



