[TOC]
# 本地方法JNI
|技术边界|Java本地方法,是Java调用本地(C/C++)库方法的技术标准|
|:-:|:-|
|特性|跨语言调用:Java调用C/C++方法<br>性能提高:执行本地方法,避开JVM占用的资源<br>已有功能利用:利用现有的C/C++库|
|使用场景|需要调用底层系统API<br>需要资源密集型计算<br>需要使用现有的C/C++库|
|应用方法|编写.h头文件:声明native方法<br>编译.h到.h文件:使用javah工具<br>编写.c(或.cpp)文件:实现native方法<br>编译.c(.cpp)到动态库(.so文件):使用gcc(Linux)或VS(Windows)<br>在Java中调用native方法|
## JNI与项目中的结构关系:
|项目结构|JNI接口|
|:-:|:-|
|Java源码|.java文件:包含调用native方法的Java类|<br>.h头文件:声明native方法的头文件|
|编译生成|无|.h头文件:.h文件,由javah生成<br>动态库文件(.so或.dll):由C/C++编译生成|
|项目部署|无|将相关的.h文件、动态库文件部署到系统相应位置|
## JNI实现关键流程:
|流程|描述|
|:-:|:-|
|编写Java类|包含native方法声明的Java类|
|生成.h头文件|使用javah工具生成.h头文件|
|编写C/C++实现|编写.c或.cpp文件,实现.h中声明的native方法|
|编译C/C++代码|生成动态库(.so或.dll文件)|
|部署动态库|将动态库部署到系统内|
|从Java调用|Java程序调用native方法,最终执行C/C++实现的方法|
## 总结:
JNI允许Java调用C/C++本地方法,可以利用C/C++提供的功能,提高性能,或调用系统底层API。其关键流程是:定义native方法、生成.h头文件、实现C/C++方法、编译为动态库、部署使用。JNI需要理解Java、C/C++两种语言,并实现两者之间的交互。
# 2. 示例
> ## 编写Java和C++ , 调用C++本地方法,
Java代码:
~~~
java
public class JNITest {
// 声明native方法,无方法体
public native void sayHello();
public static void main(String[] args) {
// 加载动态库
System.loadLibrary("JNITest");
// 创建实例,调用native方法
new JNITest().sayHello();
}
}
~~~
C++代码:
~~~
cpp
// JNITest.h头文件,由javah生成
#include "JNITest.h"
// 实现Java中声明的native方法
void JNITest.sayHello() {
// 打印日志
printf("Hello from C++!");
}
~~~
> ## 编译C++代码生成动态库:
~~~
bash
# Linux
g++ -fPIC -shared -o libJNITest.so JNITest.cpp
# Windows
cl /LD JNITest.cpp /FeJNITest.dll
~~~
> ## 部署和执行:
1\. 将生成的动态库(libJNITest.so或JNITest.dll)放到系统路径
2\. 编译Java代码:`javac JNITest.java`
3\. 执行Java代码:`java JNITest`
> ## 输出:
~~~
Hello from C++!
~~~
> ## 注释:
\- Java中声明native方法,没有方法体
\- 用javah生成.h头文件
\- C++中实现native方法
\- C++编译为动态库
\- Java加载动态库并调用native方法
\- 最终执行C++中的实现,实现Java和C++的交互
这个示例演示了JNI的完整流程和Java调用C++方法的过程。通过定义native方法,生成.h文件,编写C++实现,编译为动态库,Java可以调用C++本地方法,实现跨语言调用。
- 系统设计
- 需求分析
- 概要设计
- 详细设计
- 逻辑模型设计
- 物理模型设计
- 产品设计
- 数据驱动产品设计
- 首页
- 逻辑理解
- 微服务架构的关系数据库优化
- Java基础架构
- 编程范式
- 面向对象编程【模拟现实】
- 泛型编程【参数化】
- 函数式编程
- 响应式编程【异步流】
- 并发编程【多线程】
- 面向切面编程【代码复用解耦】
- 声明式编程【注解和配置】
- 函数响应式编程
- 语法基础
- 包、接口、类、对象和切面案例代码
- Springboot按以下步骤面向切面设计程序
- 关键词
- 内部类、匿名类
- 数组、字符串、I/O
- 常用API
- 并发包
- XML
- Maven 包管理
- Pom.xml
- 技术框架
- SpringBoot
- 项目文件目录
- Vue
- Vue项目文件目录
- 远程组件
- 敏捷开发前端应用
- Pinia Store
- Vite
- Composition API
- uniapp
- 本地方法JNI
- 脚本机制
- 编译器API
- 注释
- 源码级注释
- Javadoc
- 安全
- Swing和图形化编程
- 国际化
- 精实或精益
- 精实软件数据库设计
- 精实的原理与方法
- 项目
- 零售软件
- 扩展
- 1001_docker 示例
- 1002_Docker 常用命令
- 1003_微服务
- 1004_微服务数据模型范式
- 1005_数据模型
- 1006_springCloud
- AI 流程图生成
- Wordpress_6
- Woocommerce_7
- WooCommerce常用的API和帮助函数
- WooCommerce的钩子和过滤器
- REST API
- 数据库API
- 模板系统
- 数据模型
- 1.Woo主题开发流程
- Filter
- Hook
- 可视编辑区域的函数工具
- 渲染字段函数
- 类库和框架
- TDD 通过测试来驱动开发
- 编程范式对WordPress开发
- WordPress和WooCommerce的核心代码类库组成
- 数据库修改
- 1.WP主题开发流程与时间规划
- moho
- Note 1
- 基础命令