JNI基础(2): CMake编译简述

2022-01-09  本文已影响0人  MemetGhini

2.1 C++编译成动态库并调用

本节内容中会简单介绍JNI默认的CMakeLists.txt文件和相关语法。首先创建一个名为cmakecompile的项目看看CMakeLists.txt文件,内容如下:

//指定CMake最低版本
cmake_minimum_required(VERSION 3.18.1)
//指定项目名称
project("cmakecompile")
//把native实现文件编译成一个动态库
add_library( cmakecompile SHARED native-lib.cpp)
//把安卓系统中的log日志库找到,并获取其路径
find_library( log-lib log)
//找到后连接到本项目中,便于在Native层打印日志
target_link_libraries( cmakecompile ${log-lib})

在cpp目录下新建一个Person文件夹,里面创建Person.h/Person.cpp。把这个Person类直接追加到 cmakecompile 库中。

add_library( cmakecompile SHARED native-lib.cpp Person/Person.cpp)

或者新建一个Person动态库,连接到 cmakecompile。

add_library(person SHARED Person/Person.cpp)
target_link_libraries(cmakecompile person ${log-lib})

stringFromJNI方法改造为:

#include <jni.h>
#include <string>
#include "Person/Person.h"

extern "C" JNIEXPORT jstring JNICALL Java_com_memetghini_cmakecompile_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) {
    Person p;
    p.setName("Kadi");
    return env->NewStringUTF(p.getName().c_str());
}

注意:Person类的头文件是双引号引入的。双引号是从相对目录搜索,尖括号是从搜索目录搜索。如果想改为#include <Person.h>号可以再cmake加一句头文件搜索目录。

include_directories(Person)

这样在cmake产物目录中就有了 cmakecompile.so, person.so两个动态库并在jni层实现了调用。

上一篇下一篇

猜你喜欢

热点阅读