Android 生成so库 并调用

news2024/11/26 3:26:12

第一步:创建so库

 

第二步:看一下Native的项目结构

自动生成引用文件build.gradle(app)

   externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.22.1'
        }
    }
//每个版本的开发工具不一样 我这个是自动生成的so库文件类型,尽量用新版ASK开发工具

CMakeLists.txt

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html.
# For more examples on how to use CMake, see https://github.com/android/ndk-samples.

# Sets the minimum CMake version required for this project.
cmake_minimum_required(VERSION 3.22.1)

# Declares the project name. The project name can be accessed via ${ PROJECT_NAME},
# Since this is the top level CMakeLists.txt, the project name is also accessible
# with ${CMAKE_PROJECT_NAME} (both CMake variables are in-sync within the top level
# build script scope).
project("sodemo")

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
#
# In this top level CMakeLists.txt, ${CMAKE_PROJECT_NAME} is used to define
# the target library name; in the sub-module's CMakeLists.txt, ${PROJECT_NAME}
# is preferred for the same purpose.
#
# In order to load a library into your app from Java/Kotlin, you must call
# System.loadLibrary() and pass the name of the library defined here;
# for GameActivity/NativeActivity derived applications, the same library name must be
# used in the AndroidManifest.xml file.
add_library(${CMAKE_PROJECT_NAME} SHARED
        # List C/C++ source files with relative paths to this CMakeLists.txt.
        native-lib.cpp
        src/NativeImpl.cpp)

# Specifies libraries CMake should link to your target library. You
# can link libraries from various origins, such as libraries defined in this
# build script, prebuilt third-party libraries, or Android system libraries.
target_link_libraries(${CMAKE_PROJECT_NAME}
        # List libraries link to the target library
        android
        log)

native-lib.cpp

#include <jni.h>
#include <string>
#include "src/NativeImpl.h"

/* 获取NativeImpl */
NativeImpl nativeImpl;

NativeImpl *getNativeImpl() {
    return &nativeImpl;
}

extern "C"
JNIEXPORT jstring JNICALL
Java_com_geek_sodemo_NativeImpl_ICC_1interface_1power(JNIEnv *env, jclass clazz) {
    // TODO: implement ICC_interface_power()
    // TODO: implement getUserName()
    char *c = getNativeImpl()->ICC_interface_power();
    return env->NewStringUTF(c);
}

第三步:直接加上so库代码优化(不废话)

把native-lib.cpp分离出来创建 .h和.cpp文件 如下代码

NativeImpl.cpp

#include "NativeImpl.h"


NativeImpl::NativeImpl() {

}

NativeImpl::~NativeImpl() {

}

char *NativeImpl::ICC_interface_power() {
    // 这里处理代码逻辑
    return "卡槽上下电控制";
}

NativeImpl.h

#ifndef MYNATIVE_CLIENTIMPL_H
#define MYNATIVE_CLIENTIMPL_H

#include <vector>

class NativeImpl {
public:
    NativeImpl();
    virtual ~NativeImpl();

    virtual char* ICC_interface_power();
};


#endif //MYNATIVE_CLIENTIMPL_H

第四步:在CMakeLists.txt文件中增加cpp引入

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

native-lib.cpp增加方法

#include <jni.h>
#include <string>
#include "src/NativeImpl.h"

/* 获取NativeImpl */
NativeImpl nativeImpl;

NativeImpl *getNativeImpl() {
    return &nativeImpl;
}

extern "C"
JNIEXPORT jstring JNICALL
Java_com_geek_sodemo_NativeImpl_ICC_1interface_1power(JNIEnv *env, jclass clazz) {
    // TODO: implement ICC_interface_power()
    // TODO: implement getUserName()
    char *c = getNativeImpl()->ICC_interface_power();
    return env->NewStringUTF(c);
}

第五步:so库使用优化NativeImpl创建在应用的目录结构下

public class NativeImpl {

    // 加载so库
    static {
        System.loadLibrary("sodemo");
    }
    /**
     * 添加 native 方法
     */
    public static native String ICC_interface_power();
}
MainActivity.class中进行引用
public class MainActivity extends AppCompatActivity {


    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        // Example of a call to a native method
        TextView tv = binding.sampleText;
        tv.setText(NativeImpl.ICC_interface_power());
    }


}

最后运行看结果

上面的内容生成so库及给java代码调用就完成了

下面是怎样是这个so库给其他应用使用  如下

然后拷贝.so文件到 新创建的项目中的libs文件下 

 在build.gradle 里面android节点下增加

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

 

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

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

相关文章

揭秘消防电动开窗机:一键开启生命通道

揭秘消防电动开窗机&#xff1a;一键开启生命通道 在城市的钢铁森林中&#xff0c;高楼大厦如雨后春笋般涌现&#xff0c;为现代生活带来了前所未有的便利与繁华。然而&#xff0c;当火灾等突发事件来临时&#xff0c;这些高耸的建筑也成了逃生与救援的巨大挑战。在这关键时刻&…

瑞芯微RK3568鸿蒙开发板OpenHarmony系统修改cfg文件权限方法

本文适用OpenHarmony开源鸿蒙系统&#xff0c;本次使用的是开源鸿蒙主板&#xff0c;搭载瑞芯微RK3568芯片。深圳触觉智能专注研发生产OpenHarmony开源鸿蒙硬件&#xff0c;包括核心板、开发板、嵌入式主板&#xff0c;工控整机等&#xff0c;提供瑞芯微RK3566、RK3568、RK3588…

重置turtle坐标及方向为初始值的Python函数:turtle.home()

【重置turtle坐标及方向为初始值的Python函数&#xff1a;turtle.home()】 import turtle as t t.setup(300,300,10,10) t.turtlesize(5,8) t.pensize(1) t.pencolor("red") t.left(60) t.forward(100) t.home()【代码分析】● 重置turtle坐标及方向为初始值的Pytho…

社区团购系统开发,小程序源码(团长中心、社区拼团、限时秒杀等)

前言 在数字化时代&#xff0c;社区团购作为一种新兴的购物方式&#xff0c;以其便捷、实惠的特点迅速赢得了消费者的青睐。 一、社区团购的基本概念 社区团购是一种基于社区的集体购买模式&#xff0c;通过线上平台组织社区居民集体采购商品&#xff0c;以团购的形式从供应商…

Go常用算法集锦

前言 在日常开发中&#xff0c;我们经常会遇到一些针对复杂数据的处理&#xff0c;这时我们就会针对不同的业务使用不同算法&#xff0c;减少代码的逻辑复杂度&#xff0c;增加项目的可维护性&#xff0c;而为了保障项目的可持续性&#xff0c;一般都会进行算法的封装&#xf…

适配器模式详解和源码中应用

适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它的作用是将一个类的接口转换为客户端所期望的另一种接口。适配器模式让原本接口不兼容的类能够合作无间&#xff0c;常用于将新系统集成到旧系统中。 形象的例子&#xff1a…

文心快码前端工程师观点分享:如何保证在企业内落地?

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; 本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站1…

【3.3 激活函数(下)】

3.3 激活函数&#xff08;下&#xff09; 深度学习中的激活函数 在深度学习中&#xff0c;激活函数扮演着至关重要的角色&#xff0c;它们为神经网络引入了非线性特性&#xff0c;从而增强了模型的表达能力。以下是几种常见的激活函数及其简介、代码实现、优缺点等详细介绍。 …

深入理解AI Agent架构,史上最全解析!赶紧码住!

AI Agent框架&#xff08;LLM Agent&#xff09;&#xff1a;LLM驱动的智能体如何引领行业变革&#xff0c;应用探索与未来展望 1. AI Agent&#xff08;LLM Agent&#xff09;介绍 1.1. 术语 Agent&#xff1a;“代理” 通常是指有意行动的表现。在哲学领域&#xff0c;Agen…

计算机网络 ---- 电路交换、报文交换、分组交换

目录 零、前言 一、计算机网络发展初期面临的问题 1.1 电路交换的主要特点【电话网络采用电路交换技术】 1.1.1 电路交换的基本知识介绍 1.1.2 电路交换的优缺点 1.3 报文交换技术的特点【电报网络采用报文交换技术】 1.3.1 报文交换的基本知识介绍 1.3.2 报文交换技术…

中国企业500强!最新名单揭晓→

9月11日&#xff0c;在2024中国500强企业高峰论坛上&#xff0c;中国企业联合会、中国企业家协会连续第23次向社会发布了“中国企业500强”榜单。 01 营收规模迈上新台阶 2024中国企业500强营业收入迈上新台阶&#xff0c;突破了110万亿元大关&#xff0c;达110.07万亿元&…

【算法】哈希表相关

【ps】本篇有 5 道 leetcode OJ。 一、算法简介 哈希表是一种存储数据的容器&#xff0c;可以快速查找某个元素&#xff0c;其查找的时间复杂度为 O(1)&#xff0c;非常合适需要频繁查找某一个元素的场景。其具体用法为&#xff1a; 直接使用底层为哈希表的 STL 容器。用数组…

【一起学Rust | 进阶篇】使用Bon快速生成builder,提高代码质量

文章目录 前言一、安装Bon二、使用步骤1.为方法实现builder2.实现关联方法的builder3. 为结构体实现builder4. Option<T>字段成为可选项5. 实现Into转化 参考文档 前言 在 Rust 编程语言中&#xff0c;除了广为人知的单例模式之外&#xff0c;工厂模式也是极为容易见到的…

智能制造云平台---附源码79117

目 录 摘要 1 绪论 1.1 研究背景和意义 1.2开发技术 1.2.1 Flask框架 1.2.2 Python简介 1.2.3 MySQL数据库 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2总体设计原则 2.3 系统流程分析 2.3.1 用户登录流程 2.3.2 删除信息流程 2.4 系统角色分析 2.5 系…

微信小程序 - 最新将页面可分享到朋友圈功能,小程序实现分享到朋友圈功能,开启分享给好友及分享朋友圈功能(微信小程序怎么分享到朋友圈?详细流程及示例代码教程)

前言 没有设置过分享朋友圈功能的小程序,分享朋友圈按钮是灰色且无法点击。 在微信小程序开发中,详解实现把页面开启朋友圈分享功能,解决 “当前页面未设置分享” 且灰色无法点击问题,微信小程序开发中的微信分享和朋友圈分享设置,提供详细代码。 小程序 vue2 | vue3 版本…

yum下载软件失败:‘Could not resolve host: mirrorlist .centos .org; Unknowm error

Loaded plugins: fastestmirror, ovl Determining fastest mirrors Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infracontainer error was 14: curl#6 - “Could not resolve host: mirrorlist.centos.org; Unknow…

Games101图形学学习笔记——图形学基础

这里写目录标题 图形学基础线性代数Vector向量向量的点乘向量的叉乘 矩阵 Transform3D变换视图/相机变换 正交投影和透视投影正交投影透视投影 图形学基础 基础数学&#xff1a;线性代数&#xff0c;几何 基础物理&#xff1a;力学&#xff0c;光学 其他&#xff1a;信号处理&…

代码随想录训练营 Day56打卡 图论part06 108. 冗余连接 109. 冗余连接II

代码随想录训练营 Day56打卡 图论part06 一、卡码108. 冗余连接 题目描述 有一个图&#xff0c;它是一棵树&#xff0c;他是拥有 n 个节点&#xff08;节点编号1到n&#xff09;和 n - 1 条边的连通无环无向图&#xff08;其实就是一个线形图&#xff09;&#xff0c;如图&…

Java面试篇基础部分-Java的类加载机制

JVM的类加载 JVM在运行Java文件的时候,类加载分为5个阶段:加载、验证、准备、解析、初始化。在类初始化加载完成之后,就可以使用这个类的信息了。当这个类不需要使用的时候,就可以从JVM进行卸载。 加载 加载是指JVM读取Class文件的操作,并且根据Class的文件描述创建对应的…

工厂安灯系统在优化生产流程上的优势丨深圳讯鹏科技

工厂安灯系统通过可视化的方式&#xff0c;帮助工厂管理者和操作工人及时了解生产状态&#xff0c;快速响应问题&#xff0c;从而优化生产流程。 一、安灯系统实时监控与反馈 安灯系统的核心功能是实时监控生产线的状态。通过在生产现场设置灯光、显示屏等设备&#xff0c;工人…