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文件所在目录执行

image.png

image.png

2、在Clion中创建一个项目,将这个.h文件拷贝过去(这块有点复杂,仔细看)

.h文件拷过来后会发现报红,那是因为clion找不到这个头文件需要我们配置

image.png

 

看哪个目录下有jni.h文件

image.png

因为jni.h文件依赖jni_md.h文件,再看哪个目录下有jni_md.h文件

image.png

 

因为JNI依赖JVM的其他头文件,所以一般用目录

/home/ziya/Documents/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/include

这个目录中没有jni_md.h文件,从它的下级目录拷贝一份

image.png

然后修改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、结果

image.png

 

配置Idea、Clion

 

配置了每次生成JNI头文件、动态链接库就不需要敲命令了

 

image.png

image.png

 

1、Idea

image.png

image.png

Program:/home/ziya/Documents/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/javac

Arguments:$FileDirRelativeToProjectRoot$/$FileName$ -h ./jni

2、配置Clion

image.png

image.png

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