java调用c++函数的简单笔记
时间:2022-05-06
本文章向大家介绍java调用c++函数的简单笔记,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
java使用jni调用c++动态库函数.
步骤:
1.编写java测试代码如下:
1 public class CallNativeDemo {
2 native void func();
3
4 native double add(double a, double b);
5
6 public static void main(String[] args) {
7 System.loadLibrary("Main");
8 CallNativeDemo callNativeDemo = new CallNativeDemo();
9 callNativeDemo.func();
10 System.out.println(callNativeDemo.add(1,2));
11 }
12 }
2. 使用javac 对代码进行编译:
javac CallNativeDemo.java
3.使用javah 生成CallNativeDemo.h头文件.
javah -cp . CallNativeDemo
生成的代码如下:
1 /* DO NOT EDIT THIS FILE - it is machine generated */
2 #include <jni.h>
3 /* Header for class CallNativeDemo */
4
5 #ifndef _Included_CallNativeDemo
6 #define _Included_CallNativeDemo
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 /*
11 * Class: CallNativeDemo
12 * Method: func
13 * Signature: ()V
14 */
15 JNIEXPORT void JNICALL Java_CallNativeDemo_func
16 (JNIEnv *, jobject);
17
18 /*
19 * Class: CallNativeDemo
20 * Method: add
21 * Signature: (DD)D
22 */
23 JNIEXPORT jdouble JNICALL Java_CallNativeDemo_add
24 (JNIEnv *, jobject, jdouble, jdouble);
25
26 #ifdef __cplusplus
27 }
28 #endif
29 #endif
4.编写Main.cpp文件,如果使用的是.c文件,去掉extern "C"{}
1 #include <jni.h>
2 #include <stdio.h>
3 /*
4 * Class: CallNativeDemo
5 * Method: func
6 * Signature: ()V
7 */
8 extern "C"{
9 JNIEXPORT void JNICALL Java_CallNativeDemo_func
10 (JNIEnv *env, jobject job){
11 printf("hello world! by java and C++n");
12 }
13
14 /*
15 * Class: CallNativeDemo
16 * Method: add
17 * Signature: (II)V
18 */
19 JNIEXPORT jdouble JNICALL Java_CallNativeDemo_add
20 (JNIEnv *env, jobject job, jdouble a, jdouble b){
21
22 return a+b;
23 }
24 }
5.使用locate/find 查询jdk位置.
locate jdk
6.编写Makefile文件.
1 #makefile
2
3 .SUFFIXES: .o.cpp
4 .PHONY: clean
5 .PHONY: start
6
7
8 JDKLIB =/home/gongxijun/java/jdk1.7.0_40/include
9 CC =g++
10 SRC =Main.cpp
11 OBJS =$(SRC:.cpp =.o)
12 OS = libMain.so
13
14 .PHONY: start
15 start: $(OBJS)
16 $(CC) -shared -fpic -I $(JDKLIB) -I $(JDKLIB)/linux -o $(OS) $(OBJS)
17 .o.cpp:$(SRC)
18 $(CC) -g -Wall $@ -c $<
19 .PHONY: clean
20 clean:
21 rm -f $(OBJS)
7.使用make 编译Makefile文件,生成.so动态库.
make Makefile 或者直接 make
8.运行java程序.
java -cp . -Djava.library.path=. CallNativeDemo
8.1结果如下:
hello world! by java and C++
3.0
- python高阶函数:map(f,[list]),reduce(f,[list],可选初始值),
- 深入探讨 Java 类加载器
- 斐波那契查找原理详解与实现
- 增量数据丢失的原因分析(二)(r8笔记第76天)
- pycharm 之模块与模块引用
- 判断栈的出栈顺序合法性
- Combination Sum II 组合数求和之2-Leetcode
- Combination Sum 组合数求和-Leetcode
- python 中输出字符的颜色控制属性
- 一则数据库无法重启的案例分析(r8笔记第96天)
- 最大公约数和最小公倍数及其应用(Go语言解法)
- JAVA private私有类的 默认构造函数 的生成过程
- 一次数据变更的审核过程(r8笔记第95天)
- JavaScript 学习一
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- java获取程序执行时间
- Redis数据增多了,是该加内存还是加实例?
- 针对mysql delete删除表数据后占用空间不变小的问题
- 报错信息:(VI_1): ip address associated with VRID 80 not present in MASTER advertt : 192.168.1.8
- 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
- 如果MySQL的 InnoDB 文件的损坏,该如何手动恢复?
- 如何使用慢查询快速定位执行慢的 SQL?
- 如何使用 EXPLAIN 精准查看执行计划?
- MySQL怎么查看 SQL 的具体执行成本?
- Python 爬虫进阶必备 | 某外卖优惠平台内容加密参数分析
- pytest 自动化测试框架(二)
- Web | Django 与数据库交互,你需要知道的 9 个技巧
- 商机负责人与商机团队负责人不一致时更新团队负责人为商机负责人语句
- mysql常用语句集合(仅供工作日常学习参考)
- 新一代Notebook神器出现,Jupyter危险了!