2017-04-13 58 views
2

我的項目必須使用AAR作爲依賴關係。 AAR打包了一些類和一個jni庫(例如libdemo.so)。 jni庫在我的項目中用作LOCAL_SHARED_LIBRARIES。如何在Android Studio中使用Android插件爲Gradle 2.3.1找到打包在AAR中的jni庫?

有了Android插件gradle這個2.2.3,我採取以下兩種方式:手動

1.Unpackaged AAR並把libdemo.so在與Android.mk的目錄:

###########################prebuild libdemo.so############################## 
include $(CLEAR_VARS) 
LOCAL_MODULE := libdemo LOCAL_SRC_FILES := libdemo.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) include 
$(PREBUILT_SHARED_LIBRARY) 

2.AAR在build/intermideate中未打包。所以我設置的路徑Android.mk到libdemo.so:

###########################prebuild libdemo.so############################## 
include $(CLEAR_VARS) 
LOCAL_MODULE := libdemo 
AAR_LIB_PATH = $(LOCAL_PATH)/../../../build/intermediates/exploded-aar/vm/jni/armeabi 
LOCAL_SRC_FILES := $(AAR_LIB_PATH)/libdemo.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) 
include $(PREBUILT_SHARED_LIBRARY) 

但對於Android插件的gradle爲2.3.1,規則改變:

構建緩存:存儲某些輸出的在構建項目時,Android插件會生成 (例如,未打包的AAR和預定義的遠程依賴項 )。

我指定了一個相對於gradle.properties文件的路徑。

android.buildCacheDir=buildcache 

它的工作,我可以看到高速緩存,但我不能libdemo.so直接buildcache發現:

buildcache

我不能使用的方式2現在。 有沒有更方便的方法來鏈接jni庫?

回答

0

對於使用Android NDK的項目,使用Gradle實驗版更容易實現應用程序中的JNI功能。

提取AAR包後可訪問*.so庫文件。下面是一個示例gradle這個函數提取的AAR到相應的構建路徑保存*.so文件:

task extractSo(type: Copy) { 
    from zipTree("${project.rootDir}/libraries/name-of-aar-package.aar") 
    into "${project.rootDir}/libraries/" 
    include "jni/**/name-of-so-library.so" 
} 

定義extractSo任務的基礎build.gradle文件爲整個項目。要使用搖籃實驗版,你還必須定義類路徑搖籃實驗在基礎build.gradle文件像這樣:

buildscript { 
    repositories { 
     jcenter() 
    } 

    dependencies { 
     classpath 'com.android.tools.build:gradle-experimental:0.9.0' 
    } 
} 

要調用extractSo任務,你必須在的build.gradle文件中定義此功能的依賴爲需要它的項目模塊。下面是做到這一點的一些示例代碼:

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

model { 
    android { 
     compileSdkVersion = 25 
     buildToolsVersion = "25.0.2" 

     defaultConfig.with { 
      applicationId = "com.my.sample.package.ndkapp" 
      minSdkVersion.apiLevel = 19 
      targetSdkVersion.apiLevel = 24 
      versionCode = 1 
      versionName = "1.0" 
     } 
    } 
    android.buildTypes { 
     release { 
      minifyEnabled = false 
      proguardFiles.add(file('proguard-android.txt')) 
     } 
    } 
    android.ndk { 
     moduleName = "nativeclass_jni" 
     cppFlags.add("-std=c++11") 
     cppFlags.add("-I" + file("src/main/jni").absolutePath) 
     // Add the necessary headers required in cpp code. 
     cppFlags.add("-I" + file("${project.rootDir}/libraries/headers").absolutePath) 

     stl = "gnustl_shared" 
     // Add the necessary project .so files for all architectures. 
     ldFlags.add("-L" + file("${project.rootDir}/libraries/jni/arm64-v8a").absolutePath) 
     ldFlags.add("-L" + file("${project.rootDir}/libraries/jni/armeabi-v7a").absolutePath) 
     ldFlags.add("-L" + file("${project.rootDir}/libraries/jni/x86").absolutePath) 

     ldLibs.addAll(["log", "android", "EGL", "GLESv2"]) 

     // Specific the particular .so files this sample links against. 
     ldLibs.add("name-of-so-library") 
    } 
    android.productFlavors { 
     create ("fat") { 
      // This sample builds all architectures by default. Note that if you 
      // only want to build for a specific architecture, you need to 
      // remove the appropriate lines below. You also need to remove the 
      // .so files from the apk using 
      // "packagingOptions {exclude('lib/armeabi-v7a/*')}" in the android 
      // section. 
      ndk.abiFilters.add("arm64-v8a") 
      ndk.abiFilters.add("armeabi-v7a") 
      ndk.abiFilters.add("x86") 
     } 
    } 
} 

dependencies { 
    // specify any Android java modules this project depends on 
    // For example: 
    // compile files('libs/android-support-v4.jar') 
} 

// Extract the *.so libraries packaged in AAR files. 
build.dependsOn(':extractSo') 

爲了確保您的Java代碼可以訪問本地函數的* .so文件和你的原生Android代碼,您現在必須加載庫在你喜歡的主要活動所以:

static { 
    // Loading your native code module 
    System.loadLibrary("nativeclass_jni"); 
    // Loading your extracted *.so library 
    System.loadLibrary("name-of-so-library"); 
} 
相關問題