2017-04-23 164 views
1

我正在Android Studio中使用NDK的ffmpeg JNI。我在Android Studio外部用NDK构建了ffmpeg,并将这些库放在src/main/jni/libs/armeabi-v7a中。 接下来,我生成了JNI头文件并通过调用avformat API来实现它。但是,链接器最终无法找到libavformat.so,如下面的消息。Android Studio NDK gradle:找不到共享库

“/Users/yanghai/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/arm-linux-androideabi/bin/ld 错误:错误:找不到-lavformat“

这是我制作的build.gradle。我已经将“avformat”添加到ldLib中,但它看起来像gradle并不知道lib路径。我没有找到哪个gradle选项可以指定。我使用gradle分发版3.3,而它与旧版gradle版本2.10有相同的问题。 我很欣赏这个评论。

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion '25.0.2' 

    defaultConfig { 
     applicationId "yanghai.example.com.ffmpegtestapp" 
     minSdkVersion 24 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

     ndk { 
      moduleName "jnilib" 
      ldLibs "log", "avformat" 
      cFlags "-I${project.buildDir}/../src/main/jni/include" 
      abiFilters "armeabi-v7a" 
     } 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    sourceSets.main { 
     jni.srcDirs = ['src/main/jni'] 
     jniLibs.srcDirs = ['src/main/jni/libs'] 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:25.3.1' 
    testCompile 'junit:junit:4.12' 
} 

回答

0

我只是在自己工作,并在这里分享。我需要创建CMakeLists.txt来让cmake为我建立并链接本地库,并指定外部共享lib路径。

https://developer.android.com/studio/projects/add-native-code.html#create-cmake-script

cmake_minimum_required(VERSION 3.4.1) 

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") 

add_library(jnilib SHARED 
      native_lib.c) 

target_include_directories(jnilib PRIVATE 
          ../include) 

add_library(avformat SHARED IMPORTED) 
set_target_properties(avformat PROPERTIES IMPORTED_LOCATION 
    ${CMAKE_SOURCE_DIR}/../libs/${ANDROID_ABI}/libavformat.so) 

target_link_libraries(jnilib 
         android 
         log 
         avformat) 

的的build.gradle是这样的,与externalNativeBuild加入。

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion '25.0.2' 

    defaultConfig { 
     applicationId "yanghai.example.com.ffmpegtestapp" 
     minSdkVersion 24 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

     ndk { 
      moduleName "jnilib" 
      ldLibs "log", "avformat" 
      cFlags "-std=c++11 -I${project.buildDir}/../src/main/jni/include" 
      abiFilters "armeabi-v7a" 
     } 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    sourceSets.main { 
     jni.srcDirs = ['src/main/jni'] 
     jniLibs.srcDirs = ['src/main/jni/libs'] 
    } 
    externalNativeBuild { 
     cmake { 
      path 'src/main/jni/src/CMakeLists.txt' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:25.3.1' 
    testCompile 'junit:junit:4.12' 
} 

此外此,我联libavformat.so当发现“未定义定义”错误,最后才知道自己使用“native_lib.cpp”,这是一个C++代码试图链接C代码。

error: undefined reference to 'avformat_version()' 

它是由重命名native_lib.cpp决心native_lib.c,或增加的头文件这样的外部 “C”,

extern "C" { 
#include <libavformat/avformat.h> 
} 
相关问题