2016-09-14 2 views
3

somelibrary/lib/c++/armeabi-v7a/libsomelibrary.a 라이브러리가 있습니다. Android 프로젝트의 Gradle 파일에 어떻게 추가합니까?C++ Android Gradle 프로젝트에 "something.a"라이브러리 파일을 어떻게 추가합니까?

분명히 도서관도 somelibrary/include/somelibrary/*.h 아래의 헤더가 포함되어 있습니다.하지만 그저 에 cppFlags.addAll(['-I' + file('somepath/somelibrary/include')]) 줄을 추가 할 수 있기 때문에 쉬운 부분입니다.

그러나 어떻게하면 프로젝트에 .a 파일을 추가하여 armeabi-v7a뿐 아니라 arm64-v8a, armeabi 및 x86에서도 모든 이진 형식에서 링크가 작동하도록 할 수 있습니까? 라이브러리에는 모든 바이너리 형식의 .a 파일 버전이 포함되어 있습니다. 그리고 그 외에도 "C++"와 "gnustl"의 두 가지 다른 C++ 표준 라이브러리 버전도 포함되어 있습니다. 라이브러리의 소스 코드가 없습니다.

+0

https://discuss.gradle.org/t/how-do-i-link-ac-library-with-another-library-file-that-i-know-the-path-of/7241/3 '.lib'과'.a'는 플랫폼 윈도우와 리눅스에서 똑같습니다. –

+0

그래 플 실험 플러그인을 사용하기 때문에 도움이 될지 모르겠습니다. 그라디언트 실험에서 정적 또는 공유 된 미리 빌드 된 라이브러리에 직접 종속성을 추가 할 수 있습니다. http://tools.android.com/tech-docs/new-build-system/gradle-experimental#TOC-NDK-Dependencies – Alex

답변

2
그것은 무엇 Gradle을 버전을 사용하여 빌드의 경우에 따라 달라집니다

:

  • 는 첫째 라이브러리 저장소를 정의 : Gradle을-실험 : 0.7.3 '

    응용 프로그램 build.gradle 파일에서을

    repositories { 
        libs(PrebuiltLibraries) { 
         your_lib { 
          headers.srcDir "${your_lib_path}/include" 
          binaries.withType(StaticLibraryBinary) { 
          staticLibraryFile = file("${your_lib_path}/your_library.a") 
          } 
         } 
        } 
    } 
    
  • 당신의 NDK 모듈 정의

    android.ndk 
        { 
        moduleName = "your_ndk_module" 
        platformVersion = 9 
        toolchain "gcc" 
        debuggable true 
        cppFlags.add("-fexceptions") 
        cppFlags.add("-std=c++11") 
        stl = "gnustl_static" 
        } 
    
  • 라이브러리 소스

    android.sources { 
    
    main { 
    
        jni { 
         dependencies { 
             library "your_lib" linkage "static" 
          }     
         } 
        } 
    } 
    
  • 정의

    제품의 맛

    android.productFlavors 
        { 
    
    
           create("arm") { 
            ndk.abiFilters.add("armeabi") 
            ndk.ldFlags.add("-L${file('src/main/jniLibs/armeabi')}".toString()) 
            ndk.ldLibs.addAll(["your_lib"]) 
    
           } 
           create("arm7") { 
            ndk.abiFilters.add("armeabi-v7a") 
            ndk.ldFlags.add("-L${file('src/main/jniLibs/armeabi-v7a')}".toString()) 
            ndk.ldLibs.addAll(["your_lib"]) 
    
           } 
           create("arm8") { 
            ndk.abiFilters.add("arm64-v8a") 
            ndk.ldFlags.add("-L${file('src/main/jniLibs/arm64-v8a')}".toString()) 
            ndk.ldLibs.addAll(["your_lib"]) 
           } 
    } 
    

전체 코드를 정의 :

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

def your_lib_path = file(project(':app').projectDir).absolutePath + "/your_lib_path" 
model { 
    repositories { 
     libs(PrebuiltLibraries) { 
      your_lib { 
       headers.srcDir "${your_lib_path}/include" 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${your_lib_path}/your_library.a") 
       } 
      } 
     } 
    } 
    //define your ndk-module: 
    android.ndk { 
     moduleName = "your_ndk_module" 
     platformVersion = 9 
     toolchain "gcc" 
     debuggable true 
     cppFlags.add("-fexceptions") 
     cppFlags.add("-std=c++11") 
     stl = "gnustl_static" // Which STL library to use: gnustl or stlport 
     } 
    //define your android sources 
    android.sources { 
     main { 
      jni { 
       dependencies { 
        library "your_lib" linkage "static" 
       } 
      } 
     } 
    } 

//define your product flavours: 
android.productFlavors { 
     // for detailed abiFilter descriptions, refer to "Supported ABIs" @ 
     // https://developer.android.com/ndk/guides/abis.html#sa 
     create("arm") { 
      ndk.abiFilters.add("armeabi") 
      ndk.ldFlags.add("-L${file('src/main/jniLibs/armeabi')}".toString()) 
      ndk.ldLibs.addAll(["your_lib"]) 

     } 
     create("arm7") { 
      ndk.abiFilters.add("armeabi-v7a") 
      ndk.ldFlags.add("-L${file('src/main/jniLibs/armeabi-v7a')}".toString()) 
      ndk.ldLibs.addAll(["your_lib"]) 

     } 
     create("arm8") { 
      ndk.abiFilters.add("arm64-v8a") 
      ndk.ldFlags.add("-L${file('src/main/jniLibs/arm64-v8a')}".toString()) 
      ndk.ldLibs.addAll(["your_lib"]) 
     } 
    } 

    } 

당신은에 따라 Gradle을 파일을 수정해야 할 것이다 그라데이션 버전.

희망. 도움이됩니다.

건배.

우 나이.

+0

감사합니다. 아마 완벽한 대답 일 것입니다. 유일한 문제는 안드로이드 스튜디오가 C++로 CMake로 바뀌었고 더 이상 도움이되지 않는다는 것입니다. – kynnysmatto

관련 문제