Android Studio生成自己的so库

news2025/3/2 4:45:02

一、创建Native项目

1、新建 Native 项目

1)新建项目

         选择最下面的 Native C++ 下一步即可

2)填写项目信息

 3)选择C++版本可以直接选择默认

2、下载并配置NDK及CMake

1)进入Studio 设置 SDK 设置界面

        这里选择需要的 NDK 和 CMake 版本进行下载。

2)加载 ndk

        通过 File -> Project Structure 或 点击图标进入设置界面。

         选择对应 ndk 版本。也可以在local.properties中直接添加 ndk 路径。

## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Fri Jan 06 14:13:10 CST 2023
sdk.dir=/home/chen-xu-neu/Android/Sdk
ndk.dir=/home/chen-xu-neu/Android/Sdk/ndk/21.0.6113669

3、Native 项目结构

1)代码结构

         主要就是再 main 下增加了 cpp 文件夹以及下面的文件,这部分代码主要用来生成 so 库中代码。

2)build.gradle(app)

android {
    defaultConfig {
        // 对应创建项目时选择的 C++ 版本
        externalNativeBuild {
            cmake {
                cppFlags ''
                // 生成so库类型
                abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
            }
        }
    }
    // CMakeLists.txt 文件路径
    externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.10.2'
        }
    }
}

3)CMakeLists.txt

# cmke版本
cmake_minimum_required(VERSION 3.10.2)

# 项目名称
project("nativetestdemo")

# 生成so库配置
add_library( # 设置库名称
        native_xiaoxu
        # 将库设置为共享库
        SHARED
        # 引入代码文件
        native-lib.cpp)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # 指定目标库
        native_xiaoxu

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

4)native-lib.cpp

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

extern "C" JNIEXPORT jstring JNICALL
Java_com_wm_auto_nativetestdemo_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello XiaoXu";
    return env->NewStringUTF(hello.c_str());
}

        标准Native写法:Java_包名_类名_方法名

5)MainActivity

public class MainActivity extends AppCompatActivity {

    // 加载so库,与上面生成的库名对应
    static {
        System.loadLibrary("native_xiaoxu");
    }

    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(stringFromJNI());
    }

    /**
     * 添加 native 方法
     */
    public native String stringFromJNI();
}

        这样整个项目就完成了,运行项目会输出“Hello XiaoXu”,在build/intermediates/cmake/debug/obj/下就会生成对应的so库。这样最原始的so库就生成完了。

4、代码优化

so库代码优化

        在模块化开发及业务逻辑比较复杂时,将代码都写在 native-lib.cpp 中显然是不合理的,这就需要将代码抽取出来。

1)创建 .cpp 和 .h 文件

2)NativeImpl.h

#ifndef MYNATIVE_CLIENTIMPL_H
#define MYNATIVE_CLIENTIMPL_H

#include <vector>

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

    virtual char* getUserName();
};


#endif //MYNATIVE_CLIENTIMPL_H

3)NativeImpl.cpp

#include "NativeImpl.h"


NativeImpl::NativeImpl(){

}

NativeImpl::~NativeImpl(){

}

char* NativeImpl::getUserName(){
    // 这里处理代码逻辑
    return "XiaoXu";
}

4)CMakeLists.txt 增加 cpp 文件引入

add_library( # Sets the name of the library.
        native_xiaoxu

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        native-lib.cpp
        src/NativeImpl.cpp)

5)native-lib.cpp 增加对应方法

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

/* 获取NativeImpl */
NativeImpl nativeImpl;
NativeImpl* getNativeImpl(){
    return &nativeImpl;
}

/* 将Activity方法提取到NativeImpl中 */
extern "C" JNIEXPORT jstring JNICALL
Java_com_wm_auto_nativetestdemo_NativeImpl_getUserName(
        JNIEnv* env,
        jclass clazz) {
    char* c = getNativeImpl()->getUserName();
    return env->NewStringUTF(c);
}

so库使用优化

1)将Activity方法提取到NativeImpl中

public class NativeImpl {
    // 加载so库
    static {
        System.loadLibrary("native_xiaoxu");
    }

    /**
     * 添加 native 方法
     */
    public static native String getUserName();
}

2)Activity中使用

NativeImpl.getUserName()

项目源码

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

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

相关文章

c++之 OpenGL(1)-安装与概述

目录概述&#xff46;&#xff45;&#xff44;&#xff4f;&#xff52;&#xff41;下安装编写OpenGL应用程序测试hello,world概述 OpenGL&#xff08;英语&#xff1a;Open Graphics Library&#xff0c;译名&#xff1a;开放图形库或者“开放式图形库”&#xff09;是用于…

Linux开发工具的使用(一)

文章目录Linux开发工具的使用&#xff08;一&#xff09;1. Linux软件包管理器yum1.1 查看软件1.2 下载软件1.3 卸载软件2.vim编辑器的介绍和使用2.1 vim的介绍2.2 vim的基本操作2.3 vim命令模式命令集(必须是命令模式下)2.3.1 移动光标2.3.2 删除文字2.3.3 复制文本内容2.3.4 …

C++ 不知树系列之二叉堆排序(递归和非递归实现上沉、下沉算法)

1. 前言 什么是二叉堆&#xff1f; 二叉堆是有序的 完全二叉树&#xff0c;在完全二叉树的基础上&#xff0c;二叉堆 提供了有序性特征&#xff1a; 二叉堆 的根结点上的值是整个堆中的最小值或最大值。 当根结点上的值是整个堆结构中的最小值时&#xff0c;此堆称为最小堆。…

xpath获取标签之间的文本内容

目前在学习xpath&#xff0c;需要取一个package信息&#xff0c;如图&#xff1a; 标题 "package"在span里面&#xff0c;比较方便取&#xff0c;用这个xpath就行&#xff1a; //div[idartikeltabelle]/table/tbody/tr[1]/td[2]/span[classinsertlabela and text()pa…

/mmcv/_ext.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN3c107Warning

报/mmcv/_ext.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN3c107Warning 就是mmcv或者mmcv-full编译有问题&#xff1b; 尝试了mmcv_full-1.7.1-cp36-cp36m-manylinux1_x86_64.whl pip 安装&#xff0c;都不是对应版本&#xff1b; 在安装mmcv或者mmcv-full都是无…

如何用PPT画出好看的科研图

前言 好看的科研图可以从前人的作品中进行借鉴&#xff0c;今天介绍2副精美的科研图以及他们在PPT中的绘制方法&#xff0c;话不多说&#xff0c;先摆上标准科研图 1. 黑色粗体边框以及淡填充颜色 黑色粗体边框和淡填充颜色真的让矩形一下子变得很有质感&#xff0c;在学习的…

VMware Fusion设置静态IP+端口转发(macOS)+内网穿透

很少有资料提到配置macOS上VMware Fusion的端口转发&#xff0c;因此我在这里进行了一些记录打开网络设置解锁并添加新的网络适配器只有新的网络适配器才允许配置转发&#xff0c;默认的不允许这样做。设置NAT转发虚拟机选择使用新创建的虚拟网络适配器Ubuntu配置静态IP/DNS服务…

linux xshell用户免密登录设置

最重要准备工作 ​编辑linux xshell用户免密登录设置步骤 1.在xshel进行密钥获取操作 2.创建mkdir ~/.ssh目录&#xff08;检查有没有这个目录&#xff0c;没有自己添加&#xff09; 3.在该目录创建authorized_keys目录。注意&#xff08;目录权限为600&#xff09; 4.将刚…

Android Studio arctic Fox(北极狐)导入openCV

Android studio arctic Fox在引入opencv的时候按照正常的File->New->Import Module操作时&#xff0c;出现无法点击“Next”和“Finish”的情况。如下图 所以我们使用另外的方法进行引入。 准备工作&#xff1a; 1&#xff0c;Android Studio 2&#xff0c;下载opencv…

纪念2022年11月软考高项(信息系统项目管理师)一次通过的经验随笔

一、备考背景2022年5月的浙江软考因为疫情防控原因临时取消&#xff0c;我离杭州买房又远了几分。众所周知&#xff0c;杭州是炒房投资客的香饽饽&#xff0c;即使主城区购房摇号制度不停打补丁&#xff0c;也难济于事。自住客为了与投资客抗衡&#xff0c;一靠社保&#xff0c…

新品做软文推广发布在哪些平台好?

新产品上市前后&#xff0c;会经历开发期、介绍期、成长期、成熟期、衰退期五个阶段&#xff0c;每个阶段都需要软文推广的助力&#xff01; 当一款新品上市前后往往会面临着无法打开市场、产品卖不出去等问题&#xff0c;这个时候软文推广就要做到位&#xff0c;除了文章撰写…

在centos7安装KubeSphere

节点准备 设置hostname hostnamectl set-hostname ks-m4 关闭防火墙 启动&#xff1a; systemctl start firewalld 关闭&#xff1a; systemctl stop firewalld 查看状态&#xff1a; systemctl status firewalld 开机禁用 &#xff1a; systemctl disable firewalld 开机…

SAP 通过 OData Service 反查 CDS View 位置 视图「Workaround」

前言 使用场景&#xff1a;目前已知 OData Service 由 CDS View 发布&#xff0c;但是想要查看该 CDS 的具体内容 根据 OData Service 获取关键信息盲猜对应底表通过 SE11 反查引用位置 猜底表 目前已知 OData Service URL: http://xxx.xxx.com:xxxx/sap/opu/odata/sap/ZCD…

栉风沐雨砥砺行,春华秋实满庭芳——华秋电子2022年度大事记

岁序更替&#xff0c;春华秋实 转眼间&#xff0c;2022年已是过去 回首2022年&#xff0c;华秋肩负使命 持续为电子产业增效降本。 我们加大研发投入&#xff0c;提升全球交付保障能力&#xff1b; 我们以创新引领发展&#xff0c;以实干笃定前行&#xff1b; 以品质为基…

JetBrains 学生和教师认证教程

目录一、学生和教师授权申请方式二、申请网址三、激活JetBrains产品&#xff08;如PyCharm、IDEA&#xff09;一、学生和教师授权申请方式 详见官方教程&#xff1a; JetBrains 学生和教师授权申请方式 二、申请网址 学生和教师可以使用在学校注册的邮箱账号来申请。 新申请…

「EZEC-4」可乐(2种方法:差分+位运算 | 枚举+字典树)

「EZEC-4」可乐 洛谷&#xff1a;「EZEC-4」可乐 题目背景 很久以前&#xff0c;有一个 pigstd&#xff0c;非常迷恋美味的可乐。为了得到美味的可乐&#xff0c;他几乎用尽了所有的钱&#xff0c;他甚至对自己的 npy 也漠不关心其实是因为他没有npy&#xff0c;更不爱好看戏…

C语言实现烟花表白,内含源码!!

虽然现在看烟花有一定难度&#xff0c;但代码式烟花可以随时随地看&#xff01; 烟花的代码很多&#xff0c;实际上是可以用 Python、HTML5 等语言写烟花&#xff0c;但今天主要想和大家分享用C语言写的烟花代码&#xff0c;非常细致和实用。 同学们一定要亲自敲一遍&#xf…

机器视觉(八):图像特征提取

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …

理解文件系统

之前的东西&#xff0c;全部是在内存中的。但是我们知道&#xff1a;不是所有的文件&#xff0c;都被打开了。大量的文件&#xff0c;就在磁盘上放着&#xff0c;什么都不做。这些文件非常多&#xff0c;杂&#xff0c;乱。而磁盘级别的文件管理&#xff0c;本质工作就能够快速…

maven第三篇:maven 简单命令

上一篇聊了在IDE中如何创建maven项目&#xff0c;后面说到了maven会有一些常用的命令&#xff0c;现在就对命令进简单演示。 注意&#xff1a; 1&#xff1a;命令需要在windows桌面系统下的dos窗口运行。 2&#xff1a;下面演示的命令除了查看版本信息的命令外&#xff0c;很…