---说明,之前直接百度出来的例子,照猫画虎。没想到的是这例子居然直接来自百度百科,写着写着就囧了。。
---anyway,写完了就当是给自己看吧。
同事求助,就看了一下,照猫画虎一番,略有所得。
JNI是什么?
JNI是 Java Native Interface 的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。
-- 以上来自百度百科
JNI步骤
① java类中编写带有native 声明的方法。
② 使用 javac 命令编译所编写的java类。
③ 使用 javah 命令生成头文件。
④ 使用C/C++实现本地方法。
⑤ 生成动态连接库。
⑥ 执行(java)。
--还是来自百度百科
JNI实例
①
1 public class HelloWorld {
2 public native void displayHelloWorld();//所有native关键词修饰的都是对本地的声明
3 static {
4 System.loadLibrary("hello");//载入本地库
5 }
6 public static void main(String[] args) {
7 new HelloWorld().displayHelloWorld();
8 }
9 }
②
javac HelloWorld.java
③
javah HelloWorld
④ 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。
建议用vs,新建 Win Console - DLL 项目,新建文件:HelloWorldImpl.cpp
1 #include "jni.h"
2 #include "HelloWorld.h"
3
4 //#include other headers
5
6 JNIEXPORT void JNICALL
7 Java_HelloWorld_displayHelloWorld(JNIEnv*env,jobject obj)
8 {
9 printf("Helloworld!\n");
10 return;
11 }
注意,这里使用的是"jni.h",也可以使用<jni.h>。前者将jni.h文件复制进来即可,后者需要在项目中引入其所在的文件夹($JAVA_HOME$/include)。
但是,据我实测,实际上还需要 jni_md.h 文件,要么复制进来,要么引入其所在的文件夹($JAVA_HOME$/include/win32)。
⑤ 如无问题,就可以进行编译了。这里要注意一点,如果jdk是64位版本,那么dll也需要64位的。vs可以直接设置生成的版本。
虽然可以使用单独的命令来生成dll文件,不过这里只是一个练习,直接build项目即可生成,然后在文件夹中就能找到。
⑥ 由于我们在Java中调用的hello,所以需要将该dll复制到java所在的文件夹,并重命名。
static {
System.loadLibrary("hello");//载入本地库
}
然后,运行即可。
一般来说,如果第三方有提供dll,那可以直接调用执行。
ps:如果不用vs,那也可以使用gcc,参考百度百科。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)