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)