企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[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++本地方法,实现跨语言调用。