当前位置: 首页 > article >正文

在Android上搭建一个NDK项目

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

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

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

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

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

在init方法里面load了一个firstndkdemo的native lib。

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

project方法指定了native lib的名字,也就是MainActivity中init方法load的lib。

add_library方法指定了一个c++文件:native-lib.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)

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

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_firstndkdemo_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->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"
        }
    }


http://www.kler.cn/a/154222.html

相关文章:

  • 深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
  • 【代码pycharm】动手学深度学习v2-05 线性代数
  • 常用命令之LinuxOracleHivePython
  • Java 动态代理初步
  • 3D意识(3D Awareness)浅析
  • IDEA2024:右下角显示内存
  • 解套方式之认识T+0
  • 国内高速下载huggingface上的模型
  • 微信小程序记住密码,让登录解放双手
  • 多平台小程序编译适配,是否会让更多App互联互通?
  • 麻吉POS集成:如何无代码开发实现电商平台和CRM系统的高效连接
  • GD32 定时器输入捕获模式测量PWM占空比和频率
  • SSM项目实战-POJO设计
  • 系统地自学 Python
  • 学习TypeScrip1(基本类型)
  • 论文阅读——Img2LLM(cvpr2023)
  • flink源码分析之功能组件(四)-slot管理组件II
  • Linux 匿名页反向映射
  • SpringBoot+redis实现接口防刷
  • Web前端 ---- 【Vue】(组件)父子组件之间的通信一文带你了解
  • 【C语言:数据在内存中的存储】
  • xilinx系列FPGA基于VIVADO的pin delay列表生成说明
  • 2017年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题
  • 基于helm的方式在k8s集群中部署gitlab - 备份恢复(二)
  • 【Java Spring】SpringBoot 配置文件
  • 速通MySql