Java 通过 JNI 调用 C/C++ 类库
来源:互联网 发布:淘宝小二门事件 编辑:程序博客网 时间:2024/06/12 01:44
说明
由于一些涉及到设备或底层操作的类库,大多是C或C++语言编写的,对于Java Web开发者,在涉及到相应的项目中,不可能再去将相应的类库用Java重写。这时,就需要通过Java代码去调用C/C++的类库来完成工作。
操作环境:
- JDK 1.8.0_45
- Eclipse
- Visual Studio 2013
注意: demo中的文件路径需要加以注意!!!
演示实现
整体目标
通过Java调用C++代码编写的 *.dll 类库中封装的方法,本 Demo 中包含两个方法,一个是输出文本信息,无返回值;一个计算并返回两个整数之和。
编写Java接口
package com.daniel;/** * JNI 测试类 JNI_Test.java * @author PeiXQ */public class JNI_Test { /** * 打印文本 * @param mess */ public native void sendMess(String mess); /** * 计算数值和 * @param a * @param b * @return */ public native int plusNum(int a,int b);}
编写完成后,生成 .class 文件。
生成 *.h 头文件
进入 cmd
命令行,使用上一步生成的 .class 文件,利用 jdk 的 javah 命令生成 *.h 头文件。
# javah# -classpath :E:\JNI_Java_Pro\bin 为.class 文件所在的根路径# .class 文件的完整路径为E:\JNI_Java_Pro\bin\com\daniel\JNI_Test.class# -d : E:\tmp\JNI 输出 *.h 头文件的路径# -jni : 生成JNI样式的包头文件,可以理解成 *.class 文件的 包路径+类名# # 此处比较诡异的是,-classpath 必须得是*.class 的包路径文件的上一级;# -jni 必须是*.class 文件的 包路径+类名,否则会报错。javah -classpath E:\JNI_Java_Pro\bin -d E:\tmp\JNI -jni com.daniel.JNI_Test
编写C++代码
创建一个C++项目
设置应用类型为 dll
将 jdk 目录下的 jni.h 、 jni_md.h 以及之前生成的 com_daniel_JNI_Test.h 放入项目根路径下的 include 文件夹 (需自己创建文件夹)
添加项目包含目录,将上一步创建的 include 文件夹包含进项目。
创建 test_jni.cpp 文件,并编写 c++ 代码实现,其中的方法头,可以从 com_daniel_JNI_Test.h 中拷贝。
生成C++dll
运行C++项目的生成按钮,并在生成路径下找到生成的 dll 文件(本文为 jni_gen.dll)。
Java调用C++ dll
将生成的 *.dll 添加到Java项目的 Native Library 中,如使用Eclipse,如下图:
修改最初的 JNI_Test.java 的代码,调用 dll 中的方法,可看到最下方输出的执行结果。
- Java 通过 JNI 调用 C/C++ 类库
- java通过jni调用C程序
- Java通过JNI调用C/C++函数
- JAVA通过JNI调用C函数Demo
- Android C 通过JNI 调用JAVA
- java通过jni调用c库
- Java通过JNI调用C语言
- Java通过jni调用c语言方法
- JNI小程序:Java通过JNI调用C程序
- Java调用C JNI
- jni c调用java
- JNI java c 调用
- JNI C调用Java
- JAVA通过JNI调用本地C语言方法
- JAVA通过JNI调用本地C语言方法
- JAVA通过JNI调用本地C语言方法
- 10,JAVA通过JNI调用本地C语言方法
- JAVA通过JNI调用本地C语言方法
- react native 开发框架,封装网络请求,自定义控件,常用工具类
- 146. LRU Cache hash+链表
- androidstudio创建animtaion-list文件及创建帧动画
- [LeetCode]481. Magical String
- 跳表的实现
- Java 通过 JNI 调用 C/C++ 类库
- codeforces-140【A几何】【精度】
- .NET Core 1.1日期解析无APi、SQL Server数据转换JSON
- 面向对象 单例
- datatable插件使用
- HDU
- 遍历Map的最优方式
- Sublime Text3前端必备插件
- MyBatis分页插件PageHelper的使用