Bootstrap

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文件使用测试

 

;