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 libraryandroidlog)
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文件生成时一样。