2023-06-16 Android Studio 使用CMakeList编译JNI ,最简单的demo源码

news2024/11/25 10:40:26

一、代码结构图,代码路径https://download.csdn.net/download/qq_37858386/87913001

 二、cmakedemo\app\build.gradle 加下面的代码

    externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
        }

    externalNativeBuild {
        cmake {
            path 'src/main/jni/CMakeLists.txt'
        }
    }

三、使用loadLibrary加载so 库。

package com.hypernano.cmakedemo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    String TAG = "CMAKE_DEMO";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((TextView)findViewById(R.id.hint)).setText(GetStringFromJNI(8956));
    }
    static {
        System.loadLibrary("cmakedemo-native-jni");
    }

    public static native String GetStringFromJNI(int number);
}

四、jni 下的CMakeLists.txt 文件,这个文件就是用来指导如何编译。

cmake_minimum_required(VERSION 3.6)

set(target cmakedemo-native-jni)
project(${target} CXX)

#message(STATUS "ANDROID_ABI=${ANDROID_ABI}")
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/app/src/main/libs/${ANDROID_ABI})

file(GLOB srcs *.cpp *.c)
file(GLOB hdrs *.hpp *.h)

include_directories("${CMAKE_CURRENT_LIST_DIR}")
add_library(${target} SHARED ${srcs} ${hdrs})
target_link_libraries(${target})

五、JniTest.cpp文件


#include <string>
#include "JniTest.h"

extern "C"{

JNIEXPORT jstring JNICALL Java_com_hypernano_cmakedemo_MainActivity_GetStringFromJNI
         (JNIEnv *env, jclass clazz ,jint number) {
    // TODO: implement stringFromJNI()
    jstring result;
    jstring str_data;
    char str[20];
    sprintf(str, "%d",number);

    std::string hello = "I am from  cmakedemo jni C++ 202306151710";
    result = env->NewStringUTF(hello.c_str());
    str_data = env->NewStringUTF(str);
    return  result;
 }
}

六、JniTest.h文件

//
// Created by Watson on 2023/6/15.
//
#include <jni.h>
#ifndef CMAKEDEMO_JNITEST_H
#define CMAKEDEMO_JNITEST_H
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jstring JNICALL  Java_com_hypernano_cmakedemo_MainActivity_GetStringFromJNI
(JNIEnv *, jclass ,jint );



#ifdef __cplusplus
}
#endif

#endif //CMAKEDEMO_JNITEST_H

七、build - build APK之后就在build**cmake目录下生成so,点击 analyze就可以看到apk包含so库(下图右边)

九、真机运行结果,可以调用jni的接口了。

 十、参考文章

Android jni开发-1(用CMake编译jni)_android cmake编译jni_ls_star的博客-CSDN博客

Android Studio CMakeList编译JNI_android cpp 编译选择架构_郭家远的博客-CSDN博客

JNI 应用:使用 CMake 编译 生成 so_cmake方式怎么生成jni库_老姚---老姚的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/651943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国内大模型研究

自从chatgpt发布以来&#xff0c;国内大模型发展非常迅速。我对这项目技术也保持了非常多的持续关注&#xff0c;我一直认识&#xff0c;chatGPT以及其他GPT会给社会带来更大的变革。经过专业训练的大模型可以替代部分客服&#xff0c;部分程序员&#xff0c;部分美工&#xff…

Vue全家桶实战 从零独立开发企业级电商系统(免费升级Vue3.0)

Vue全家桶高仿小米商城–项目简介 文章目录 Vue全家桶高仿小米商城--项目简介电商项目选型--小米商城的页面流程&#xff1a;业务开发流程&#xff1a;项目内容&#xff1a;商城组件部分&#xff1a;课程所包含的知识图谱&#xff1a;章节介绍&#xff1a; 商城的界面展示&…

基于web漏洞扫描及分析系统设计_kaic

基于web漏洞扫描及分析系统设计 摘 要 随着信息技术的发展和网络应用在我国的普及&#xff0c;针对我国境内信息系统的恶意网络攻击也越来越多&#xff0c;并且随着黑客攻击技术的不断地更新&#xff0c;网络犯罪行为变得越来越难以应对&#xff0c;用户日常访问的网站是否安全…

【八大排序(六)】快排终极篇-快速排序非递归版

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:八大排序专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习排序知识   &#x1f51d;&#x1f51d; 快排非递归版 1. 前情回顾2. 快排非递归基…

A100 GPU服务器安装CUDNN教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

从Window中先多瞥几眼

JavaFx17官方文档中有如下的描述: Window类是一个顶层窗口类,在其中可以承载场景,并与用户交互。窗口可以是Stage、PopupWindow或其他类似的顶层窗口。 JavaFX Stage类是顶级的JavaFX容器。初级阶段由平台搭建。其他Stage对象可以由应用程序构造。 许多Stage属性是只读的…

chatgpt赋能python:Python入门:如何添加Seaborn库

Python入门&#xff1a;如何添加Seaborn库 Python是一种易于学习的、功能强大的编程语言&#xff0c;在数据分析和科学计算方面尤其闻名。Seaborn是一个建立在Matplotlib之上的Python可视化库&#xff0c;它提供了一组简单易用的界面&#xff0c;用于绘制优美的统计图形——包…

几个Caller-特性的妙用

System.Runtime.CompilerServices命名空间下有4个以“Caller”为前缀命名的Attribute&#xff0c;我们可以将它标注到方法参数上自动获取当前调用上下文的信息&#xff0c;比如当前的方法名、某个参数的表达式、当前源文件的路径&#xff0c;以及当前代码在源文件中的行号。 一…

RedisSon高并发分布式锁实战RedisSon源码解读

Redis高并发分布式锁实战 1.分布式场景下的synchronized失效的问题–用redis实现分布式锁 synchronized是通过monitor实现的jvm级别的锁&#xff0c;如果是分布式系统&#xff0c;跑在不同的虚拟机上的tomcat上&#xff0c;会导致synchronized无法锁住对象 ----------- 需要分…

读数据压缩入门笔记05_字典转换

1. 瓶颈 1.1. 在网络带宽有限、存储昂贵的时期 1.2. 移动设备正日益成为人们访问互联网的首选的今天 1.3. 数据压缩成了缓解这些瓶颈的关键 2. 字典转换 2.1. dictionary transforms 2.2. 完全改变了人们对数据压缩的认知 2.2.1. 压缩变成了一种对各种类型的数据都有用的…

《C和指针》读书笔记(第十一章 动态内存分配)

目录 0 简介1 为什么使用动态内存分配2 malloc和free3 calloc和realloc4 使用动态分配的内存5 常见的动态内存错误6 内存分配实例6.1 排序一列整型值6.2 复制字符串6.3 变体记录的创建与销毁 7 总结 0 简介 在实际开发中&#xff08;C语言&#xff09;&#xff0c;数组的元素存…

JDK,JRE,JVM有什么区别?跨平台?跨语言?

JDK Java Development Kit&#xff08;Java开发工具包&#xff09;&#xff0c;提供了Java的开发环境和运行环境。包含Java源文件的编译器Javac&#xff0c;还有调试和分析工具。 JRE Java Runtime Environment&#xff08;Java运行环境&#xff09;包含了Java虚拟机&#xff…

WPF开发txt阅读器10:语音播报快进快退

文章目录 MySpeech类快进 文章目录 MySpeech类快进 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录字体控件绑定&#x1f48e;前景/背景颜色书籍管理系统&#x1f48e;用树形图管理书籍语音播放&#x1f48e;播放进度显示 MySpeech类 …

MySQL 中有哪些锁?

数据库中锁的设计初衷处理并发问题&#xff0c;作为多用户共享资源&#xff0c;当出现并发访问的时候&#xff0c;数据库需要合理控制资源访问规则。锁就是实现这些访问规则中的重要数据。 锁的分类 根据加锁范围&#xff0c;MySQL 里面的锁可以分成全局锁、表级锁、行锁三类…

计算机视觉算法——BEV Perception算法总结

计算机视觉算法——BEV Perception算法总结 计算机视觉算法——BEV Perception算法总结1. Homograph Based——3D LaneNet2. Depth Based——LSS3. MLP Based——PON4. Transformer Based——BEVFormer5. Transformer Based——Translating Image into Maps 计算机视觉算法——…

急于生成人工智能是有风险的:如何保护数据

每天的业务用户都在尝试使用 ChatGPT 和其他生成式 AI 工具。事实上&#xff0c; Gartner 预测&#xff0c; 到 2025 年&#xff0c;30% 的营销内容将由生成式人工智能创建并由人类增强。 然而&#xff0c;像三星这样的公司已经发现&#xff0c;不了解新技术风险的用户正在成…

linux(线程控制)

目录&#xff1a; 1.线程创建 2.线程等待 3.线程终止 4.线程分离 5.线程ID -------------------------------------------------------------------------------------------------------------------------------- 1.线程创建 pthread_create pthread_t *pthread 是一个输出型…

Nucleo-F411RE (STM32F411)LL库体验 5 - 通用定时器TIM2的使用

Nucleo-F411RE &#xff08;STM32F411&#xff09;LL库体验 5 - 通用定时器TIM2的使用 1、简述 设定TIM2&#xff0c;计数周期为10KHZ&#xff0c;即计时1s需要10000次&#xff0c;通过shell命令动态修改reload值&#xff0c;来更改定时器的频率。 假定设定TIM2 counter cloc…

第五章 部署PKI与证书服务

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 前言 PKI&#xff08;公钥加密基础结构&#xff09;&#xff1a;通…

【C++】list的使用和模拟实现

目录 1.什么是list2.list的一些接口3.list的模拟实现3.1 迭代器3.2 list主体3.2.1 构造函数3.2.2 拷贝构造、赋值重载3.2.3 主体内引入迭代器3.2.4 insert和erase3.2.5 clear和析构函数 3.3 const迭代器的实现3.4 实现迭代器的operator-> 4.总结list迭代器的实现 1.什么是li…