Android引入第三方so库的一些细节

一.引入他人so库需要修改或创建的文件

1. build.gradle

在这里插入图片描述
此文件需要注意的地方有三点:

  1. targetSdkVersion 。
  2. jniLibs.srcDirs = [‘libs’]。
  3. 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文件。

  • 排查步骤:
  1. 先查看第一部分所说的路径问题。
  2. 在AS中打开build->Analyze APK
  3. 打开后排查在libs下是否有你所需要的库,没有就是路径出错。
Android Studio中引入第三方C++的步骤如下: 1. 将第三方的源代码放入项目的jni目录下,例如:`/app/src/main/jni/third_party_lib/`。 2. 在项目的`build.gradle`文件中添加以下代码: ```gradle android { // ... defaultConfig { // ... externalNativeBuild { cmake { cppFlags "-std=c++11 -frtti -fexceptions" abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } } // ... } // ... externalNativeBuild { cmake { path "CMakeLists.txt" } } ``` 其中,`path`指定了CMakeLists.txt文件的路径,`cppFlags`指定了编译选项,`abiFilters`指定了支持的CPU架构。 3. 在项目的`CMakeLists.txt`文件中添加以下代码: ```cmake add_library(third_party_lib SHARED IMPORTED) set_target_properties(third_party_lib PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/third_party_lib/libthird_party_lib.so) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party_lib/include) ``` 其中,`add_library`指定了的名称,`IMPORTED`表示这是一个外部,`IMPORTED_LOCATION`指定了文件的路径,`include_directories`指定了头文件的路径。 4. 在JNI代码中调用第三方的函数。 ```c++ #include "third_party_lib/include/third_party_lib.h" extern "C" JNIEXPORT jstring JNICALL Java_com_example_myapplication_MainActivity_callThirdPartyLib(JNIEnv* env, jobject /* this */) { ThirdPartyLib thirdPartyLib; std::string result = thirdPartyLib.doSomething(); return env->NewStringUTF(result.c_str()); } ``` 其中,`third_party_lib/include/third_party_lib.h`是第三方的头文件,`ThirdPartyLib`是第三方的类,`doSomething`是第三方的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值