2016-04-22 6 views
1

私はopencv android sdkを使用するプロジェクトを持っていますし、C++でいくつかの関数を実装することを決めるのはスピードアップのためです。Gradle実験用JNI OpenCvアーム64-v8aリンカエラー

私はgradle experimentalプラグイン0.4.0を使用していますが、arm64-v8aをビルドするとき、リンカーはjniLibsフォルダ内のライブラリを見つけることができないと教えてくれます..さまざまなバリエーションを試してみて、パスは正しいと思います

apply plugin: 'com.android.model.application' model{ 



android { 

    compileSdkVersion = 23 
    buildToolsVersion = "23.0.2" 
    /* sourceSets.main { 
     jniLibs.srcDir 'src/main/jniLibs' //set libs as .so's location instead of jni 
     jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk file 
    }*/ 
    defaultConfig.with { 
     applicationId = "com.sketchcamera.camera" 
     minSdkVersion.apiLevel = 15 
     targetSdkVersion.apiLevel = 23 
     versionCode = 105 
     versionName = "1.05" 
    } 


} 


android.buildTypes { 
    release { 
     minifyEnabled = false 
     proguardFiles.add(file('proguard-android.txt')) 
     //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     //jniDebuggable = true 
     // signingConfig signingConfigs.release 
    } 
    debug { 
     //jniDebuggable = true 
    } 
} 
android.productFlavors { 
    create("AArch-64") { 
     ndk.with{ 
      abiFilters.add("arm64-v8a") 

      File curDir = file('./') 
      curDir = file(curDir.absolutePath) 
      String libsDir = curDir.absolutePath + "/src/main/jniLibs/arm64-v8a/" 

      ldLibs.add(libsDir + "libopencv_core.a") 
      ldLibs.add(libsDir + "libopencv_highgui.a") 
      ldLibs.add(libsDir + "libopencv_imgproc.a") 
      ldLibs.add(libsDir + "libopencv_java3.so") 
      ldLibs.add(libsDir + "libopencv_ml.a") 

     } 
    } 
    create("arm") { 
     ndk.with{ 
      abiFilters.add("armeabi") 

      File curDir = file('./') 
      curDir = file(curDir.absolutePath) 
      String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi/" 

      ldLibs.add(libsDir + "libopencv_core.a") 
      ldLibs.add(libsDir + "libopencv_highgui.a") 
      ldLibs.add(libsDir + "libopencv_imgproc.a") 
      ldLibs.add(libsDir + "libopencv_java3.so") 
      ldLibs.add(libsDir + "libopencv_ml.a") 

     } 
    } 
    create("armv7") { 
     ndk.with { 
      abiFilters.add("armeabi-v7a") 

      File curDir = file('./') 
      curDir = file(curDir.absolutePath) 
      String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi-v7a/" 
      ldLibs.add(libsDir + "libopencv_core.a") 
      ldLibs.add(libsDir + "libopencv_highgui.a") 
      ldLibs.add(libsDir + "libopencv_imgproc.a") 
      ldLibs.add(libsDir + "libopencv_java3.so") 
      ldLibs.add(libsDir + "libopencv_ml.a") 
      ldLibs.add(libsDir + "libopencv_ts.a") 

     } 
    } 
} 

android.ndk { 
    moduleName = "opencv_fast_processing" 
    cppFlags.add("-std=c++11") 
    cppFlags.add("-fexceptions") 
    cppFlags.add("-I${file("/home/onur/Masaüstü/Home/OpenCV-android-sdk/sdk/native/jni/include")}".toString()) 
    ldLibs.addAll(["android", "EGL", "GLESv2", "dl", "log", "z"]) 
    stl = "gnustl_shared" 
} 
// android.useLibrary = 'org.apache.http.legacy' 

}私はARM7を使用するか、腕が、arm64-v8aのそれリンカーであればコンパイルした場合

すべては罰金です:これは私のapp.gradleある

(CDを使用することにより、端末上で確認)このエラーは

/home/onur/Android/android-ndk-r11c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9/../../../../aarch64-linux-android/bin/ld: cannot find -l/home/onur/AndroidStudioProjects/SketchCamera/app/src/main/jniLibs/arm64-v8a/libopencv_core.a 

や他のファイルに同じエラー.. 私はberforeを言ったように、私はパスが正しいことを確信しているが、/家の前に-lが何であるかを知らない(あまり持っていません

私はこのJNIのことに慣れていて、おそらく何か愚かなことをしています。助けをありがとう

+1

OpenCVのは、私はGradleのを私のためにndkBuildやCMakeの構成、Androidのメーカー2.2 – AndreyICE

+0

arm64-v8aライブラリなしで来ます実験的0.9.0。受け入れられた回答としてマークする必要があります。 –

答えて

3

私はlibcrypto(OpenSSL)と同じ問題に直面しました。 build.gradleファイルを変更して解決することができました。

は、コードのこの部分削除します:代わりにproductFlavorsを使用して、私は、次の例のようにrepositoresセクションに変更

abis { 
     create("x86") { 
      ldLibs.add("${file("src/main/jniLibs/x86/libcrypto.so")}".toString()) 
     } 
     create("x86_64") { 
      ldLibs.add("${file("src/main/jniLibs/x86_64/libcrypto.so")}".toString()) 
     } 
     create("armeabi-v7a") { 
      ldLibs.add("${file("src/main/jniLibs/armeabi-v7a/libcrypto.so")}".toString()) 
     } 
     create("arm64-v8a") { 
      ldLibs.add("${file("src/main/jniLibs/armeabi-v7a/libcrypto.so")}".toString()) 
     } 
    } 

をそして追加この1:最後に内部のABIフィルタを設定

repositories { 
    prebuilt(PrebuiltLibraries) { 
     prebuiltSharedlib { 
      binaries.withType(SharedLibraryBinary) { 
       sharedLibraryFile = file("src/main/jniLibs/${targetPlatform.getName()}/libcrypto.so") 
      } 
     } 
    } 
} 
android.sources { 
    main { 
     jni { 
      dependencies { 
       library "prebuiltSharedlib" 
      } 
     } 
    } 
} 

ndkセクション:

abiFilters.addAll(["armeabi-v7a", "arm64-v8a", "x86", "x86_64"]) 

それが役立つことを願っています。

公式のソースからAndroid用
+1

作品における公式のGradleクライアントの両方によって完全に供給を通じてOpenCVので作業する方がはるかに簡単であると考えてい – marcu

関連する問題