本文介绍: target_link_libraries方法用来指定一个目标文件可执行文件或者库文件需要链接的库文件的。你可以指定文件名称,也可以指定文件路径。你还可以指定链接范围比如PUBLIC、PRIVATE或者INTERFACE,来控制文件的传递性。project方法指定native lib名字,也就是MainActivityinit方法loadlib。再来看一下nativelib.cpp,毫无疑问这里面就是stringFromJNI方法的具体底层实现

首先New Project选择Native C++,点击Next

填入项目名称和包名,点击Next

这里我们选择Cmake默认的C++版本

创建好的项目目录里面我们正常的Android项目多了一个cpp目录

打开MainActivity里面定义一个jni方法stringFromJNI()

init方法里面load了一个firstndkdemonative lib

打开cpp目录里面有一个Cmakelists.txt, 这里面cmake_minimum_required指定cmake版本

project方法指定native lib名字,也就是MainActivityinit方法loadlib

add_library方法指定了一个c++文件nativelib.cpp

target_link_libraries方法是用来指定一个目标文件可执行文件或者库文件需要链接的库文件的。这个方法可以让你在编译链接阶段正确解析链接依赖的库文件。你可以指定库文件的名称,也可以指定库文件的路径。你还可以指定链接范围,比如PUBLIC、PRIVATE或者INTERFACE,来控制库文件的传递性。


cmake_minimum_required(VERSION 3.22.1)


project("firstndkdemo")

add_library(${CMAKE_PROJECT_NAME} SHARED
        # List C/C++ source files with relative paths to this CMakeLists.txt.
        native-lib.cpp)

target_link_libraries(${CMAKE_PROJECT_NAME}
        # List libraries link to the target library
        android
        log)

再来看一下nativelib.cpp,毫无疑问这里面就是stringFromJNI方法的具体底层实现

#include <jni.h>
#include <string&gt;

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_firstndkdemo_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env-&gt;NewStringUTF(hello.c_str());
}

这个方法给java返回了一句话”Hello from C++“

直接运行程序,可以看到MainActivity中的textview获取到了c++方法返回的问候语。

忽略了一个事情,CMakeLists.txt配置文件需要gradle里面指定一下

    externalNativeBuild {
        cmake {
            path = file("src/main/cpp/CMakeLists.txt")
            version = "3.22.1"
        }
    }

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注