Java JNI初探
---说明,之前直接百度出来的例子,照猫画虎。没想到的是这例子居然直接来自百度百科,写着写着就囧了。。
---anyway,写完了就当是给自己看吧。
同事求助,就看了一下,照猫画虎一番,略有所得。
JNI是什么?
NI是 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,参考百度百科。
转载于:https://www.cnblogs.com/larryzeal/p/5687392.html
Java JNI初探相关推荐
- java jni调用dll文件_Java通过jni调用动态链接库
(1)JNI简介 JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++).从Java1.1开始,JNI标准成为java ...
- Java JNI简单实现
Java JNI简单实现 JNI(Java Native Interface)允许了Java和C&C++进行交互?这不折腾人嘛! 一.JNI简述 http://baike.baidu.com/ ...
- Java AIO初探(异步网络IO)
Java AIO初探(异步网络IO) 原文: http://www.blogjava.net/killme2008/archive/2009/09/20/295743.html 按照<Unix网 ...
- java jni开发_Java JNI开发实践记录
当使用到JNI的时候,基本可以肯定Java的平台移植性注定减弱,接下来记录一次使用Java JNI开发的经历. 关于Java JNI的相关资料参见: 下面是使用JNI常见三种场景: 1.在Java应用 ...
- java并发初探ConcurrentSkipListMap
java并发初探ConcurrentSkipListMap ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了 ...
- java并发初探ConcurrentHashMap
java并发初探ConcurrentHashMap Doug Lea在java并发上创造了不可磨灭的功劳,ConcurrentHashMap体现这位大师的非凡能力. 1.8中ConcurrentHas ...
- java并发初探ThreadPoolExecutor拒绝策略
java并发初探ThreadPoolExecutor拒绝策略 ThreadPoolExecuter构造器 corePoolSize是核心线程池,就是常驻线程池数量: maximumPoolSize是最 ...
- java并发初探CyclicBarrier
java并发初探CyclicBarrier CyclicBarrier的作用 CyclicBarrier,"循环屏障"的作用就是一系列的线程等待直至达到屏障的"瓶颈点&q ...
- java并发初探CountDownLatch
java并发初探CountDownLatch CountDownLatch是同步工具类能够允许一个或者多个线程等待直到其他线程完成操作. 当前前程A调用CountDownLatch的await方法进入 ...
最新文章
- Java核心技术卷1——笔记(1)
- 基于window-based模板的多View程序(转)
- MySQL----ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
- TF-A代码阅读: SP_EL3栈内存-cpu_data内存的介绍(cpu_context介绍)
- Enterprise Library 2.0 技巧(4):如何用编程的方法来配置Logging Application Block
- C++11学习笔记-----线程库std::thread
- 16.1 用户变量语法
- 汤普森算法_Eamp;E算法在汽车之家推荐系统中的应用
- 怎么理解汉罗塔问题_小白理解的汉诺塔中的递归问题
- 动漫品牌“爆笑虫子”宣布与xNFT Protocol战略合作,开发NFT数字卡牌游戏
- Javascript 权威指南第五版 手记(1) 引用类型
- 普通用户从非80端口启动tomcat,通过端口转发监听80端口
- DOM之事件高级(附实例、图解)
- 软考-计算机组成原理与结构
- overload java_Java方法重载Overload原理及使用解析
- IDEA使用ideaVim, 配置自定义vim快捷键
- tp6 的unique验证
- Ubuntu下设置开机启动项
- 按分数段统计学生人数python_用Excel统计各分数段学生数
- 创始人也会有的流量焦虑
热门文章
- bash删除文件中的空行
- 前端学习(2881):初始化dom和数据化线程池
- [css] 说说你对前端二倍图的理解?移动端使用二倍图比一倍图有什么好处?
- [css] 你有使用过css的writing-mode属性吗?说说它有哪些应用场景?
- 工作263:弹性布局 修改样式
- 前端学习(2689):重读vue电商网站10之表格展开页
- 前端学习(2137):webpack的介绍和安装
- 前端学习(1407):多人管理27代码优化
- 前端学习(1337):mongoDB文档查询
- shiro学习(4):shiro认证流程