JNI与实战内存池 JNI只看这一篇就够了
实战内存池
为了节省课堂时间,我又写了一遍。课上我会从搭建项目一步一步让大家看到我们一般是如何使用C++开发出一个庞大的系统的。
这个源码只有内存池,对于基础不是很好的同学,读起来会简单很多。
源码地址:https://gitee.com/luban-ziya/cpp-memory-pool
实战节奏:
1、实现Memory Pool与Memory Chunk的关系
2、检测内存泄漏及输出内存申请位置
3、处理Memory Pool、Memory Chunk、Memory Cell之间的关系
4、整个内存池的释放需要注意的细节
JNI基础
1、生成JNI头文件
Java代码
public class MyThread { public native void run0(); public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + " say: " + i); } } }
进入.java文件所在目录执行
2、在Clion中创建一个项目,将这个.h文件拷贝过去(这块有点复杂,仔细看)
.h文件拷过来后会发现报红,那是因为clion找不到这个头文件需要我们配置
看哪个目录下有jni.h文件
因为jni.h文件依赖jni_md.h文件,再看哪个目录下有jni_md.h文件
因为JNI依赖JVM的其他头文件,所以一般用目录
/home/ziya/Documents/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/include
这个目录中没有jni_md.h文件,从它的下级目录拷贝一份
然后修改CMakeLists.txt,加include_directories,这样你写JNI程序,clion的自动提示就可以用了
cmake_minimum_required(VERSION 3.16) project(c_mythread C) set(CMAKE_C_STANDARD 99) include_directories("/home/ziya/Documents/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/include") add_executable(c_mythread main.c com_luban_ziya_jni_MyThread.c)
3、生成动态链接库
/usr/bin/gcc -shared -fpic -I/home/ziya/Documents/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/include com_luban_ziya_jni_MyThread.c -o /lib/libjni.so
注意:动态链接库需要生成在jvm能加载到的地方,如果不知道放哪,可通过打印参数看jvm默认从哪些位置加载
System.out.println(System.getProperty("java.library.path"));
4、使用动态链接库
public class App { public static void main(String[] args) { System.loadLibrary("jni"); new MyThread().run0(); } }
5、结果
配置Idea、Clion
配置了每次生成JNI头文件、动态链接库就不需要敲命令了
1、Idea
Program:/home/ziya/Documents/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/javac Arguments:$FileDirRelativeToProjectRoot$/$FileName$ -h ./jni
2、配置Clion
Arguments这样填
-shared -fpic -I/home/ziya/Documents/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/include com_luban_ziya_jni_MyThread.c -o /lib/libjni.so