2017-04-23 9 views
1

私はAndroidスタジオで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はここにあります。私はldLibsに "avformat"を追加しましたが、それはlibleのパスを知らないgraleに見えます。私はどの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が外部共有ライブラリパスを指定して、私のためにネイティブライブラリをビルドしてリンクさせる必要があります。

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リンクするとき、私は「未定義の定義」エラーを発見し、そして最終的に私はCコードをリンクしようとC++のコードである「native_lib.cpp」を使用していたことに気づきました。

error: undefined reference to 'avformat_version()' 

native_lib.c、またはこのようなヘッダファイルのための外部の "C" を追加するリネームnative_lib.cppによって解決だ、

extern "C" { 
#include <libavformat/avformat.h> 
} 
関連する問題