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

Android studio 利用cmake编译和使用so文件

1.编译出so文件

1.1 创建支持c++的项目

需要在sdk-tools下载ndk和cmake

Android studio会自动给一个含有jni的demo,运行打印出 hello c++;

 //这边你文件project
static {
        System.loadLibrary("withnewest");
    }
//声明需要调用的方法
public native String stringFromJNI();
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_withnewest_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

这边需要注意包名_类名_方法名(与后面调用so文件的方法很重要)

1.2 jni方法

删掉原先方法,不建议在MainActivity里面书写jni然后生成so文件

package com.example.sotry;

public class Radio {
    public native String kisstheradio();
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_sotry_Radio_kisstheradio(
        JNIEnv* env,
        jobject /* this */
        ){
    std::string hello = "Hello  kiss the radio";
    return env->NewStringUTF(hello.c_str());
}

以下是结构

运行截图

1.3 生成so文件

#cmake 最小需要的版本 
cmake_minimum_required(VERSION 3.22.1)


project("sotry")

#最前面是文件名字,如果是使用的第三方库要放好路径 如果出现错误 检查是否是绝对路径
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)

build_cxx_Debug_obj里面存储的就是对应的so文件

2.使用第三方so文件

当你有一个下载下来现成的so文件(版本适用),你需要知道的,类名,方法名,包名;这样才能正确调用,以下将以刚才生成的so文件为例做例子,其次以soundtouch的so文件为例进行运行尝试。

2.1 同上创建一个支持c++的android项目

创建方法相同,不作赘述

2.2 导入so文件

在main文件夹以下新建一个jniLibs文件夹 与cpp文件夹和java文件夹同级别,放入需要使用的so文件

jniLibs文件夹就不需要修改build.gradle了,如果文件夹名字自定义 需要在app级别的build.gradle添加

    sourceSets{
        main{
            jniLibs.srcDirs=['src/main/jniLibs']
        }
    }

2.3 创建与so文件打包时候对应的包-类-方法

在java文件夹底下创建与之前jni方法makefile时同级别的包,相同的类名和之前声明过的方法

public class Radio {

    public native String kisstheradio();

    static {
        System.loadLibrary("sotry");
    }
}

后在需要的地方调用即可

运行截图同上,如果需要测试是否正确可以在之前项目里面把jni实现里面打印的语句修改,修改之后发现新项目打印的语句还是同修改之前即so文件生成时一样。

2.4 soundtouch开源库so文件使用测试

 


3.补充

又在windows上面试了一下,以上为macos系统运行结果,以下如果windows里面运行报错找不到.so文件

尝试在CMakeLists.txt中添加目标库

#这边放置你的so文件的绝对路径,可以在文件管理器中尝试索引是否正确
#mac是/,windows用\\
set_target_properties(soundtouch PROPERTIES
        IMPORTED_LOCATION ${ANDROID_ABI}\\libsoundtouch.so
)

add_library(${CMAKE_PROJECT_NAME} SHARED
        # List C/C++ source files with relative paths to this CMakeLists.txt.
        native-lib.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
        soundtouch
        android
        log)


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

相关文章:

  • 理解Linux的select、poll 和 epoll:从原理到应用场景
  • llamaindex实战-QueryEngine-查询引擎使用概述
  • CPU进行float16计算,C++的half.hpp使用方式FP16运算
  • 力扣第 74 题是 搜索二维矩阵
  • docker-mysql
  • SOA、分布式、微服务之间的关系和区别?
  • 【K230 CanMV】machine.FPIOA、Pin 与 GPIO 全解析
  • 自然语言处理基础之文本预处理
  • C/C++中的调用约定
  • 【开篇】.NET开源 ORM 框架 SqlSugar 系列
  • 下载maven 3.6.3并校验文件做md5或SHA512校验
  • 深度学习中的梯度下降算法:详解与实践
  • Flink-State状态
  • 【STM32学习】TB6612FNG驱动芯片的学习,驱动电路的学习
  • sizeof和strlen区分,(好多例子)
  • hive3.1.3安装及基本例子
  • JS怎么实现Module模块化?
  • neo4j5.25,jdk21,eclipse下载安装全配置
  • SpringBoot生成顺序规则编号-查询数据库方式实现
  • JAVA变量类型
  • hCaptcha 图像识别 API 对接说明
  • Python系列 - MQTT协议
  • 【UE5 C++课程系列笔记】06——定时器的基本使用
  • 曲面单值化定理
  • Flutter EventBus
  • 阿里云ECS服务器磁盘空间不足的几个文件