2017-04-23 201 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> 
} 
相關問題