一.引入他人so库需要修改或创建的文件
1. build.gradle
此文件需要注意的地方有三点:
- targetSdkVersion 。
- jniLibs.srcDirs = [‘libs’]。
- abiFilters “armeabi-v7a”。在下面代码片段有具体解释
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.gebilaolitou.videotest"
minSdkVersion 22
//引入第三方库targetSdkVersion不得大于或等于23
targetSdkVersion 22
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//指定NDK强制使用"armeabi-v7a",编译器不去其他目录遍历(x86等目录)。
ndk {
abiFilters "armeabi-v7a"
}
//so库的存放地址
sourceSets {
main {
//库地址 此形式的目录就是app/libs/armeabi-v7a/“引入的so库”
jniLibs.srcDirs = ['libs']
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
//你的CMakeLists.txt的文件名,置于项目根目录下,或且置于app和项目根目录下。
path "CMakeLists.txt"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'net.butterflytv.utils:rtmp-client:3.0.1'
implementation 'com.android.support:appcompat-v7:25.3.1'
implementation 'com.android.support:design:25.3.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
2. CMakeLists.txt
在使用他人的CMakeLists.txt 文件需要注意所引用库的路径问题。
cmake_minimum_required(VERSION 3.4.1)
add_library(native-stream
SHARED
src/main/cpp/native_stream.cpp
src/main/cpp/mp4_stream.c)
#获取上级目录
get_filename_component(PARENT_DIR ${CMAKE_SOURCE_DIR} PATH)
set(CURRENT_DIR ${CMAKE_SOURCE_DIR})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
set(CMAKE_VERBOSE_MAKEFILE on)
add_library(ffmpeg-single
SHARED
IMPORTED)
//设置ffmpeg-single动态库的地址 ${CURRENT_DIR}代表在app目录下
set_target_properties(ffmpeg-single
PROPERTIES IMPORTED_LOCATION
${CURRENT_DIR}/libs/armeabi-v7a/libffmpeg.so
)
#头文件
include_directories(${CURRENT_DIR}/libs/armeabi-v7a/include)
target_link_libraries(native-stream ffmpeg-single log)
2.一些常见的错误及问题排查
1 java.lang.UnsatisfiedLinkError: dalvik.sys… couldn’t find “libijkffmpeg.so”。该类错误是找不到so文件。
- 排查步骤:
- 先查看第一部分所说的路径问题。
- 在AS中打开build->Analyze APK
- 打开后排查在libs下是否有你所需要的库,没有就是路径出错。