web-dev-qa-db-ja.com

Androidスタジオ、gradle、そしてNDK

私はこの全体的な取り組みとAndroid Studioのサポートについては非常に新しいです。私はエクスポートオプションを使用して自分のAndroidプロジェクトをgradleに変換することに成功しました。

しかし、私はNDKビルドをgradleビルドプロセスに統合する方法についての文書または出発点を探しています。

可能であれば、ビルドバイナリ(.soファイル)をアセットディレクトリにコピーするある種の "後"段階も必要です。

150
plaisthos

私たちは1.3でプレビューとして統合の最初のバージョンをリリースしました: http://tools.Android.com/tech-docs/Android-ndk-preview

1.3が完成した後も統合はプレビューのままです。それがいつ最終的になるかに関して現在のETAはありません(2015/07/10現在)。

ここでより多くの情報: http://tools.Android.com/tech-docs/Android-ndk-preview

83
Xavier Ducrohet

アップデート:NDKサポートのあるAndroid Studioが公開されました。 http://tools.Android.com/tech-docs/Android- ndk-preview

スクリプトを使って構築するには、以下のgradleソリューションがうまくいくはずです。

私は自分のビルドスクリプトを使用していて、私のファイルに追加しています(0.8+のために働くように思えます):これは以下の解決策と同等のようです(しかし、gradleファイルでよりよく見えます):

 Android {
    sourceSets {
        main {
            jniLibs.srcDirs = ['native-libs']
            jni.srcDirs = [] //disable automatic ndk-build
        }
    }
 }

ディレクトリが存在しない場合や.soファイルが含まれていない場合でも、残念ながらビルドは失敗しません。

42
plaisthos

Android Studioが1.0にアップデートされたことで、NDKツールチェーンのサポートが大幅に改善されました(注:新しい実験用GradleプラグインとAndroid Studio 1.5の使用方法を確認するには、この記事の最後にあります).

Android StudioとNDKは十分に統合されているので、モジュールのbuild.gradleにndk {}ブロックを作成し、ソースファイルを(module)/ src/main/jniディレクトリに設定するだけです。やった!

これ以上コマンドラインからndk-buildを実行する必要はありません。

私はここに私のブログ記事でそれについてすべて書いた: http://www.sureshjoshi.com/mobile/Android-ndk-in-Android-studio-with-swig/

重要な点は次のとおりです。

ここで知っておくべきことが2つあります。デフォルトでは、Androidアプリケーションにロードしたい外部ライブラリがある場合、それらはデフォルトで(モジュール)/ src/main/jniLibsで検索されます。モジュールのbuild.gradleでsourceSets.main.jniLibs.srcDirsを設定することでこれを変更できます。ターゲットにしている各アーキテクチャ用のライブラリのサブディレクトリが必要です(例:x86、arm、mips、arm64-v8aなど)。

NDKツールチェーンによってデフォルトでコンパイルされるコードは(module)/ src/main/jniにあります。上記と同様に、モジュールのbuild.gradleでsourceSets.main.jni.srcDirsを設定して変更できます。

そしてこれをあなたのモジュールのbuild.gradleに入れてください:

ndk {
  moduleName "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
  cFlags "-std=c++11 -fexceptions" // Add provisions to allow C++11 functionality
  stl "gnustl_shared" // Which STL library to use: gnustl or stlport
}

C++コードをコンパイルし、そこからロードしてラッパーを作成する必要があります。ただし、質問から判断すると、そのすべてを実行する方法は既にわかっているので、再ハッシュは行いません。

また、この例のGithubレポジトリをここに置きました。 http://github.com/sureshjoshi/Android-ndk-swig-example

アップデート:2015年6月14日

Android Studio 1.3が登場したら、JetBrains CLionプラグインを通してC++のサポートが改善されるはずです。私は現在、これがAndroid Studio内からのJavaおよびC++開発を可能にすると想定しています。しかし、私は上で述べたようにGradle NDKセクションを使用する必要があると思います。さらに、CLionがそれらを自動的に行わない限り、Java <-> C++ラッパーファイルを書く必要性がまだあると思います。

更新日:2016年1月5日

私は私のブログとGithubレポ(更新ブランチにあります)を最新の実験的なGradleプラグイン(0.6.0-alpha3)でAndroid Studio 1.5を使うために更新しました。

http://www.sureshjoshi.com/mobile/Android-ndk-in-Android-studio-with-swig/http://github.com/sureshjoshi/Android-ndk -swig-example

NDKセクション用のGradleビルドは次のようになりました。

Android.ndk {
    moduleName = "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
    cppFlags.add("-std=c++11") // Add provisions to allow C++11 functionality
    cppFlags.add("-fexceptions")
    stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
}

また、Android StudioにはC++用のオートコンプリート機能があります。Javaが生成したラッパーは 'native'キーワードを使用します。

Example of auto-complete of C++-Java wrapper

SWIGを使ってライブラリをラップしてコードを自動生成してから、ネイティブキーワードauto-generationを使用しようとすると、Swig _wrap内の間違った場所にコードが配置されます。 .cxxファイル...したがって、それを "extern C"ブロックに移動する必要があります。

C++-Java wrapper moved to correct location

更新日:2017年10月15日

Android Studio 2.2以降では、GradleとCMakeを介したNDKツールチェーンの本質的に「ネイティブな」(サポートなし)サポートがあることに言及していなければ、私は思いがけないでしょう。さて、あなたが新しいプロジェクトを作成するときは、C++サポートを選択するだけでいいのです。

それでも、独自のJNIレイヤコードを生成するか、または前述のSWIG手法を使用する必要がありますが、AndroidプロジェクトでのC++の足場は今では簡単です。

CMakeListsファイル(C++ソースファイルを配置する場所)の変更は、Android Studioによって検出され、関連するライブラリが自動的に再コンパイルされます。

40
SJoshi

Google IO 2015年、GoogleはAndroid Studio 1.3でのNDKの完全統合を発表しました。

それは今プレビューの範囲外であり、そして誰にでも利用可能である: https://developer.Android.com/studio/projects/add-native-code.html

昔の答え:プロジェクトソースにjniディレクトリがある場合、Gradleは自動的にndk-buildを呼び出します。

これはAndroid studio 0.5.9(canary build)に取り組んでいます。

  1. NDKをダウンロード
  2. Android Studioプロジェクトの環境変数にAndroid_NDK_HOMEを追加するか、ndk.dir=/path/to/ndklocal.propertiesを追加します。これにより、Androidスタジオは自動的にndkを実行できます。
  3. Ndkプロジェクトの例を見るには、 最新のgradleサンプルプロジェクト をダウンロードしてください。 (それらはページの一番下にあります)。良いサンプルプロジェクトはndkJniLibです。
  4. NDKサンプルプロジェクトからgradle.buildをコピーします。それはこのように見えるでしょう。このgradle.buildはアーキテクチャごとに異なるapkを作成します。 build variantsペインを使用して、どのアーキテクチャーを希望するかを選択する必要があります。 build variants pane

    apply plugin: 'Android'
    
    dependencies {
        compile project(':lib')
    }
    
    Android {
        compileSdkVersion 19
        buildToolsVersion "19.0.2"
    
        // This actual the app version code. Giving ourselves 100,000 values [0, 99999]
        defaultConfig.versionCode = 123
    
        flavorDimensions "api", "abi"
    
        productFlavors {
            Gingerbread {
                flavorDimension "api"
                minSdkVersion 10
                versionCode = 1
            }
            icecreamSandwich {
                flavorDimension "api"
                minSdkVersion 14
                versionCode = 2
            }
            x86 {
                flavorDimension "abi"
                ndk {
                    abiFilter "x86"
                }
                // this is the flavor part of the version code.
                // It must be higher than the arm one for devices supporting
                // both, as x86 is preferred.
                versionCode = 3
            }
            arm {
                flavorDimension "abi"
                ndk {
                    abiFilter "armeabi-v7a"
                }
                versionCode = 2
            }
            mips {
                flavorDimension "abi"
                ndk {
                    abiFilter "mips"
                }
                versionCode = 1
            }
            fat {
                flavorDimension "abi"
                // fat binary, lowest version code to be
                // the last option
                versionCode = 0
            }
        }
    
        // make per-variant version code
        applicationVariants.all { variant ->
            // get the version code of each flavor
            def apiVersion = variant.productFlavors.get(0).versionCode
            def abiVersion = variant.productFlavors.get(1).versionCode
    
            // set the composite code
            variant.mergedFlavor.versionCode = apiVersion * 1000000 + abiVersion * 100000 + defaultConfig.versionCode
        }
    
    }
    

これはあなたのAndroid.mkとApplication.mkファイルを無視することに注意してください。回避策として、atuomatic ndk-build呼び出しを無効にしてから、ndkソースのディレクトリを手動で指定するようにgradleに指示することができます。

sourceSets.main {
    jniLibs.srcDir 'src/main/libs' // use the jni .so compiled from the manual ndk-build command
    jni.srcDirs = [] //disable automatic ndk-build call
}

さらに、自動呼び出しを無効にしただけなので、gradleビルドスクリプトでndk-buildを明示的に呼び出すことをお勧めします。

task ndkBuild(type: Exec) {
   commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
}
35

私は "gradle 1.11 com.Android.tools.build:gradle:0.9.+"がビルド前のndkをサポートしているのを見つけました。* .soをディレクトリsrc/main/jniLibsに入れるだけです。 gradleを構築するとき、ndkを正しい場所にパッケージします。

これが私のプロジェクトです

[:____]プロジェクト:
 | --src 
 |  -  |  - メイン
 |  -  |  -  | --Java 
 |  -  -  |  -  | --jniLibs 
 |  -  |  -  |  -  | --armeabi 
 |  -  |  -  |  -  |  -  |  - 。soファイル[ | --libs 
 |  -  | --other.jar 
23
Eric Woo

Xavierが言ったように、gradle 0.7.2以降を使用している場合は、プレビルトを/ src/main/jniLibs /に置くことができます。

撮影元: https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/ctDp9viWaxoJ

18
Naxos

今のところ(Android Studio v0.8.6)それは非常に簡単です。 「Hello world」タイプのアプリを作成する手順は次のとおりです。

  1. Android NDKをダウンロードして、ルートフォルダをどこか適切な場所に配置します - おそらくSDKフォルダと同じ場所です。

  2. 次をlocal.propertiesファイルに追加してください:ndk.dir=<path-to-ndk>

  3. defaultConfig行の直後のversionNameクロージャー内でbuild.gradleファイルに次のコードを追加します。ndk { moduleName="hello-world" }

  4. アプリモジュールのmainディレクトリに、jniという名前の新しいフォルダを作成します。

  5. そのフォルダの中にhello-world.cという名前のファイルを作成します。

  6. hello-world.cでメソッドを呼び出す方法(または関数かどうか)の例については、以下のActivityコードの例を参照してください。


hello-world.c

#include <string.h>
#include <jni.h>

jstring
Java_me_mattlogan_ndktest_MainActivity_stringFromJNI(JNIEnv* env, jobject thiz)
{
    return (*env)->NewStringUTF(env, "Hello world!");
}

MainActivity.Java

public class MainActivity extends Activity {

    static {
        System.loadLibrary("hello-world");
    }

    public native String stringFromJNI();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String testString = stringFromJNI();

        TextView mainText = (TextView) findViewById(R.id.main_text);
        mainText.setText(testString);
    }
}

build.gradle

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "me.mattlogan.ndktest"
        minSdkVersion 15
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "hello-world"
        }
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

非常によく似たアプリの完全なソースコードをここで見つけてください(NDKを除く)

15
Matt Logan

あなたがUNIXを使っているなら、最新バージョン(0.8)はndk-buildを追加します。追加する方法は次のとおりです。

Android.ndk {
    moduleName "libraw"
}

JNIは 'src/main/jni'の下にあるはずです。それ以外の場合は、次のように定義できます。

sourceSets.main {
    jni.srcDirs = 'path'
}

2014年1月28日、バージョン0.8では、ビルドがWindowsで壊れています。ビルドを無効にする必要があります。

sourceSets.main {
    jni.srcDirs = [] //disable automatic ndk-build call (currently broken for windows)
}
8
Anthony

エレガントな回避策は https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/Z5yWAvCh4h4J に示されています。

基本的には、 "lib/armeabi/yourlib.so"を含むjarを作成してから、そのjarをビルドに含めます。

7
aleb

@ plaisthosからの答えは最新のgradleバージョンに入りましたが、それを行う方法はまだあります。プロジェクトディレクトリのルートにnative-libsディレクトリを作成し、このディレクトリにすべてのライブラリをコピーします。

Build.gradleに次の行を追加してください。構築して幸せになりましょう。

task copyNativeLibs(type: Copy) {
    from(new File(project(':<your project>').getProjectDir(), 'native-libs')) { include '**/*.so' }
    into new File(buildDir, 'native-libs')
}

tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }

clean.dependsOn 'cleanCopyNativeLibs'
4
Leandros

容易にコンパイルされる.so-ファイルのパッケージ化を自動化する良い答えは 別の(閉じられた)スレッド にあります。それを機能させるために、私は行を変更しなければなりませんでした:

from fileTree(dir: 'libs', include: '**/*.so')

に:

from fileTree(dir: 'src/main/libs', include: '**/*.so') 

この変更がなければ、.soファイルは見つかりませんでした。したがって、それらをパッケージ化するためのタスクは実行されません。

4
HYS

これは私がgradleからAndroid-ndkを使用して構築するために使用するコードです。これには、gradle.propertiesにndkディレクトリパスを追加します。下記のコードからわかるように、ndkdir=/home/user/Android-ndk-r9dを追加し、すべてのjniファイルをsrc/main/内のnativeフォルダーに配置します。 System.loadLibrary("libraryname");のように普通に使うことができるネイティブライブラリを含むjarファイルを作成します。

dependencies {
    compile fileTree(dir: "$buildDir/native-libs", include: '*.jar')
}

task ndkBuild(type: Exec) {
    commandLine "$ndkdir/ndk-build", "--directory", "$projectDir/src/main/native", '-j', Runtime.runtime.availableProcessors(),
            "APP_PLATFORM=Android-8",
            "APP_BUILD_SCRIPT=$projectDir/src/main/native/Android.mk",
            "NDK_OUT=$buildDir/native/obj",
            "NDK_APP_DST_DIR=$buildDir/native/libs/\$(TARGET_Arch_ABI)"
}

task nativeLibsToJar(type: Jar, description: 'create a jar with native libs') {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    from fileTree(dir: "$buildDir/native/libs", include: '**/*.so')
    into 'lib/'
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn nativeLibsToJar
}

nativeLibsToJar.dependsOn 'ndkBuild'
3
sujithvm

私は以下のコードを使ってネイティブのDropboxライブラリをコンパイルしました。AndroidStudio v1.1を使っています。

task nativeLibsToJar(type: Zip) {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    extension 'jar'
    from fileTree(dir: 'src/main/libs', include: '**/*.so')
    into 'lib/'
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
3
Sam

ndk.dir=/usr/shareData/Android-ndk-r11b // ndkのパスを使用しました

Androidのスタジオプロジェクトではlocal.propertiesファイルのファイル。そしてこの行を追加します。
Android.useDeprecatedNdk=true

Androidのスタジオプロジェクトでgradle.propertiesファイルの。

ここでより多くの情報: http://tools.Android.com/tech-docs/Android-ndk-preview

2

NDKビルドアンドグラドル(ベーシック)

一般的にNDKを使ったビルドは、Android.mkへのndkBuildパスまたはCMakeLists.txtへのcmakeパスを正しく指定するのと同じくらい簡単です。 Android StudioのC/C++サポートはCLionに基づいており、プロジェクトフォーマットとしてCMakeを使用しているため、私は古いAndroid.mkよりもCMakeをお勧めします。私の経験では、これはIDEをより大きなプロジェクトでより敏感にする傾向がありました。プロジェクトでコンパイルされたものはすべて自動的に構築され、APKにコピーされます。

apply plugin: 'com.Android.library'

Android {
    compileSdkVersion 19
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 19

        ndk {
            abiFilters 'armeabi', 'armeabi-v7a', 'x86'
            // 64-bit support requires an Android API level higher than 19; Namely 21 and higher
            //abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }

        externalNativeBuild {
            cmake {
                arguments '-DANDROID_TOOLCHAIN=clang',
                        '-DANDROID_PLATFORM=Android-19',
                        '-DANDROID_STL=gnustl_static',
                        '-DANDROID_ARM_NEON=TRUE'

            }
        }
    }

    externalNativeBuild {
        cmake {
            path 'src/main/jni/CMakeLists.txt'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

プロジェクトにビルド済みのライブラリを追加する(上級者向け)

NDKビルド内のスタティックライブラリ(.a)は自動的にインクルードされますが、ビルド済みのダイナミックライブラリ(.so)はjniLibsに配置する必要があります。これはsourceSetsを使用して設定できますが、標準を採用する必要があります。ビルド済みのライブラリをインクルードするときは、build.gradleに追加のコマンドは必要ありません。

jniLibsのレイアウト

構造の詳細については、 Android Gradle Pluginユーザーガイド を参照してください。

|--app:
|--|--build.gradle
|--|--src:
|--|--|--main
|--|--|--|--Java
|--|--|--|--jni
|--|--|--|--|--CMakeLists.txt
|--|--|--|--jniLibs
|--|--|--|--|--armeabi
|--|--|--|--|--|--.so Files
|--|--|--|--|--armeabi-v7a
|--|--|--|--|--|--.so Files
|--|--|--|--|--x86
|--|--|--|--|--|--.so Files

その後、結果のAPKに、通常はbuild/outputs/apk/の下にある.soファイルが含まれていることを確認し、unzip -l myApp.apkを使用して内容を一覧表示します。

共有ライブラリの構築

NDKで共有ライブラリを構築している場合は、これ以上作業をする必要はありません。それは正しくAPKにバンドルされます。

Android Studioが安定版チャンネルになったので、 Android-ndk samples を実行するのはかなり簡単です。これらのサンプルは ndk実験用プラグイン を使用しており、Android NDKオンラインドキュメントからリンクされているものよりも新しいものです。うまく動いたら、build.gradle、local.properties、gradle-wrapper.propertiesの各ファイルを調べて、それに応じてプロジェクトを修正します。以下はそれらを機能させるためのステップです。

  1. [設定]、[外観と動作]、[システム設定]、[Android SDK]の順に選択し、[SDKツール]タブを選択して、リストの下部にあるAndroid NDKバージョン1.0.0を確認します。これでNDKがダウンロードされます。

  2. 新しくダウンロードしたNDKの場所を指定します。これはsdk/ndk-bundleディレクトリに配置されます。ファイル、プロジェクト構造、SDKの場所(左側)を選択し、Android NDKの場所の下にパスを指定してこれを行います。これはlocal.propertiesに次のようなndkエントリを追加します。

    Mac/Linux:ndk.dir =/Android/sdk/ndk-bundle
    Windows:ndk.dir = C:\ Android\sdk\ndk-bundle

このようにして、gles3gni、ネイティブコーデック、およびビルダーを除く、すべてのプロジェクトをリポジトリ内で正常にビルドおよびデプロイしました。私は以下を使っています:

Android Studio 1.3ビルドAI-141.2117773
2015年7月28日に公開されたAndroid-ndkサンプル(上記のリンク)
SDKツール24.3.3
NDK r10eがC:\ Android\sdk\ndk-bundleに解凍されました
Gradle 2.5
Gradleプラグイン0.2.0
Windows 8.1 64 bit

1
Nate

eclipseからAndroid studioでプロジェクトを設定する:gradleにエクスポートせずにEclipse ndkプロジェクトをAndroid studioにインポートする必要があります。また、ndkのパスを追加する必要がありますlocal.properties、エラーが表示されたら追加

sourceSets.main {
        jniLibs.srcDir 'src/main/libs' 
        jni.srcDirs = [] //disable automatic ndk-build callenter code here
    }

build.gradleファイルを作成し、ターミナルを使用してjniフォルダとファイルを作成して実行する

1

Naxosが言ったこと(正しい方向に私を送ってくれてありがとうNaxos!)を拡張するために、私は最近リリースされたNDKの例からかなり多くを学び、ここに同様の質問で答えを投稿しました。

Android Gradle plugin 0.7でNDKを設定する方法

この記事では、ビルド済みのネイティブライブラリをさまざまなアーキテクチャ用にアプリにリンクする方法の詳細と、build.gradleスクリプトにNDKサポートを直接追加する方法について説明します。ほとんどの場合、あなたはもはやZipの周りの作業をしてコピーする必要はないはずです。

1
reactive-core

NDKをAndroid Studioプロジェクトで機能させるために使用した手順は、次のとおりです。私は手助けするためにこのチュートリアルを使いました https://software.intel.com/en-us/videos/using-the-ndk-with-Android-studio

NDKを使用するには、local.propertiesにNDK行を追加する必要があります。だからあなたのsdk.dirの下に追加

ndk.dir=C\:\\MyPathToMyNDK\ndk

私のアプリbuild.gradleでは、次のようなコードがあります。

        ndk {
            moduleName "myLib"
            ldLibs "log"
            stl "gnustl_shared"
            cFlags "-std=c++11 -frtti -fexceptions -pthread"
        }

moduleNameは、ネイティブコードに付ける名前です。私はこれが共有ライブラリと呼ばれるものであると信じています。 ldLibsは私がLogCatにログインすることを可能にします、stlはあなたがインポートしたいstlです。 Eclipse NDKと同じように、たくさんのオプションがあります。 ( http://www.kandroid.org/ndk/docs/CPLUSPLUS-SUPPORT.html

cフラグはまだ私にとってはある程度の黒魔術です。私はすべてのオプションとそれらが私に与えるもののための良い情報源を見つけていません。 StackOverflowで必要なものを探してください。それが私が見つけたところです。私は、c ++ 11によって私が新しいc ++ 11標準を使用できるようになることを知っています。

これがネイティブコードからLogCatにログインする方法の例です。

__Android_log_print(Android_LOG_DEBUG, "TestApp", "Adding - String %d has a field name of %s and a value of %s", i, lKeyUTF8.c_str(), lValueUTF8.c_str());
1
GR Envoy

今私はとても成功をロードすることができます!

1.soファイルをこのパスに追加します

Project:

| --src | - | --main | - | - | --Java | - | - | --jniLibs | - | - | - | --armeabi | - | - | - | - | - 。soファイル

2.このコードをgradle.buildに追加します。

Android {
splits {
    abi {
        enable true
        reset()
        include 'x86', 'x86_64', 'arm64-v8a', 'armeabi-v7a', 'armeabi'
        universalApk false
    }
}

}

3 .System.loadLibrary("yousoname");

  1. あなたのために頑張って、それはgradle 1.2.3で良いです
0
xiaoyuan hu

この行をapp build.gradleに追加するだけです。

dependencies {
    ...
    compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
}

task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    extension 'jar'
    from fileTree(dir: 'libs', include: '**/*.so')
    into 'lib/armeabi/'
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
0
sagus_helgy
  1. プロジェクトをEclipseからエクスポートした場合は、以下のコードをgradleファイルに追加します。

    Android {
       sourceSets{
            main{
               jniLibs.srcDir['libs']  
          }  
        }
    }
    

2. Androidスタジオでプロジェクトを作成した場合

src/main /にjniLibsという名前のフォルダを作成し、*。soファイルをjniLibsフォルダに置きます。

そして、あなたのgradleファイルに以下のようにコードをコピーしてください:

Android {
    sourceSets{  
       main{  
         jniLibs.srcDir['jniLibs']  
      }  
    }
}
0
Yachao

SJoshi(Oracleの人)が最も完全な答えを持っていると私は思いますが、SWIGプロジェクトは特別な場合、興味深く、役に立つものですが、標準のSDK antベースのプロジェクトでうまくいった大多数のプロジェクトには一般化されません。 NDK私たち全員が今では最も可能性が高いと思われるAndroidスタジオを使用したいと思いますか、または理論的には格好のモバイル用のよりCIに優しいビルドツールチェーンを希望します。

私はどこかから借りて私のアプローチを投稿しました(私はSOでこれを発見しましたが、アプリbuild.gradleの要旨を投稿しました: https://Gist.github.com/truedat101/c45ff2b69e91d5c8e9c7962d4b96e841 )。一言で言えば、私は次のことをお勧めします。

  • プロジェクトを最新のgradleビルドにアップグレードしないでください
  • プロジェクトルートでcom.Android.tools.build:gradle:1.5.0を使用してください
  • アプリプロジェクトでcom.Android.applicationを使用する
  • Gradle.propertiesがAndroid.useDeprecatedNdk = trueであることを確認してください(文句を言う場合)。
  • 上記のアプローチを使用して、Android.mkファイルを作成する時間と労力が捨てられないようにします。あなたはどのArchを構築するかを制御します。そして、これらの指示はWindowsユーザにとって親切で、理論的には特別な問題なしにWindows上で構築できるはずです。

Android用のGradleは私の考えでは混乱しています。これは、Mavenの概念を借りることと、プロジェクト用のディレクトリの構造を説得力があることが好きなためです。このNDK機能は、ほぼ3年以上前から「近日公開」されています。

0
truedat101