2017-04-13 9 views
2

私のプロジェクトでは、依存関係のためにAARを使用する必要があります。 AARはいくつかのクラスとjniライブラリ(例:libdemo.so)をパッケージ化しています。 jniライブラリは、プロジェクトでLOCAL_SHARED_LIBRARIESとして使用されています。 Gradleの2.2.3のためのAndroidのプラグインでAndroidプラグインでAARにパッケージ化されたjniライブラリの検索方法2.3.1?

、私は、次の2つの方法取る:手動

1.Unpackaged AARをしてAndroid.mkに関連したディレクトリにlibdemo.so入れる:

###########################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でアンパッケージされています。

###########################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) 

しかし、Gradleの2.3.1のためのAndroidのプラグインのために、ルールが変更さ::だから私はAndroid.mkにlibdemo.soするパスを設定し

ビルドキャッシュ:店舗一定の出力をAndroidプラグインは、プロジェクトをビルドする際に を生成します(パッケージ化されていないAARや事前にデキューされた リモート依存など)。

gradle.propertiesファイルに対する相対パスを指定します。

android.buildCacheDir=buildcache 

直接buildcacheそれは作品と私はキャッシュを見ることができますが、私はlibdemo.so見つけることができません:私は今WAY 2を使用することはできません

buildcache

。 jniライブラリをリンクする便利な方法はありますか?

答えて

0

Android NDKを使用しているプロジェクトでは、Gradle実験版を使用してアプリケーションにJNI機能を実装する方が簡単です。

*.soライブラリファイルは、AARパッケージを抽出した後にアクセスできます。ここで*.soファイルを保持し、対応するビルド・パスにAARを抽出するサンプルGradleの機能である:

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" 
} 

は、プロジェクト全体のベースbuild.gradleファイルにextractSoタスクを定義します。

buildscript { 
    repositories { 
     jcenter() 
    } 

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

extractSoタスクを起動するには、build.gradleファイルで、この関数への依存関係を定義する必要があります。Gradleの実験的なバージョンを使用するには、そのようなベースbuild.gradleファイル内の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のコードでネイティブ関数にアクセスできるようにするには、今のようなあなたのメインの活動にライブラリをロードする必要がありますso:

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