Androidスタジオ、gradle、NDK


153

このGradle全体とAndroid Studioのサポートは初めてです。エクスポートオプションを使用してAndroidプロジェクトをGradleに変換できました。

しかし、NDKビルドをGradleビルドプロセスに統合するためのドキュメントまたは開始点を探しています。

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


私は、上記のリンク以下に私の答えを掲載している stackoverflow.com/questions/20900814/...
アフマド・アリナシル

24
新しい読者:この質問は、Android Studioベータ期間中に最初に尋ねられたことに注意してください。答えは時間とともに変化しました。回答に記載されているGradleバージョンと、回答が実際に投稿された日時に注意してください。
Sean Beach、

何かが本当に変わった場合は、質問を編集してステータスを反映させます
plaisthos

カナリアチャンネルのAndroid Studio 1.3はNDKを完全にサポートしています。参照:tools.android.com/download/studio/canary/latest
Vikasdeep Singh

2015年6月18日:Android Studio 1.3ベータ版がベータチャネルで利用可能になりました。申し訳ありませんが、このビルドにはまだC / C ++サポートが含まれていません。出典:tools.android.com/recent/androidstudio13betaavailable
fastr.de

回答:


85

統合の最初のバージョンを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


2
Android Studio(およびGradleサポート)でのデバッグでNDKとコマンド補完を使用できたらすばらしいと思います
powder366

1
@GREnvoy-Androidスタジオで適切なNDKビルダーを構成するにはどうすればよいですか?手順を教えてもらえますか?:)
Shravan

7
@DirtyBeachなぜ時代遅れなのですか?StudioにはNDKの統合はまだありません。現在取り組んでいますが、現時点ではETAはありません。
Xavier Ducrohet、2015年

2
私の行動は、私が「統合」をどのように定義しているかに基づいていました。「NDKをGradleで使用する方法」を意味すると理解しましたが、どれも素晴らしい解決策ではありませんが、現在は存在しています。しかし、あなたのコメントに基づいて、あなたのチームは真の統合が何であるかについて、何か他のことを考えているようです。以前の声明を撤回します。
Sean Beach

2
NDKの統合はGoogle IO 2015の間に発表されました。AndroidStudio 1.3で利用可能です(プレビューはすぐにダウンロードできます。利用可能になったときにリンクを投稿します)。
サイプレスフランケンフェルト2015年

43

更新: 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ファイルが含まれていない場合でも、ビルドは失敗しません。


5
これは、新しいAndroid Studioバージョンでは機能しません。回避策はありますか?
powder366

@ powder366私の答えを見てください。
Leandros

2
Groovyのマジックのビット:tasks.withType(com.android.build.gradle.tasks.PackageApplication) { it.jniFolders = [file("libs")] as Set }。助けてくれてありがとう!
trnl 2013

Android Studio 0.8.9の手順は何ですか
Pandiri Deepak '30

1
@plaisthos正しい方向を指摘してくれてありがとう!Gradleスクリプトの2行目jni.srcDirs = [] //disable automatic ndk-buildは、Android StudioがC / C ++ソースコードを再構築できないため、非常に重要です。私はあなたの投稿を見てこれが私の問題を解決するまで、2日間これを理解しようとしました。C / C ++はMakefileによって40年以上ビルドされてきたので、NDKビルドは、gradleスクリプトではなく、Android.mkコマンドラインのmakefileのみで個別にビルドする方が良いと思います。
tonga

40

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日

最新の実験的なGradleプラグイン(0.6.0-alpha3)でAndroid Studio 1.5を使用するように、ブログとGithubリポジトリ(developブランチ内)を更新しました。

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には、「native」キーワードを使用してC ++-Javaで生成されたラッパーのオートコンプリート機能があります。

C ++-Javaラッパーのオートコンプリートの例

しかし、それは完全にバラ色ではありません...ライブラリをラップしてコードを自動生成し、ネイティブキーワードの自動生成を使用しようとすると、コードがSwig _wrapの間違った場所に配置されます。 .cxxファイル...したがって、「extern C」ブロックに移動する必要があります。

C ++-Javaラッパーが正しい場所に移動

更新:2017年10月15日

Android Studio 2.2以降では、GradleとCMakeを介したNDKツールチェーンが本質的に「ネイティブ」(駄洒落ではない)サポートされていることについて言及しなかったとしたら、私は見逃してしまいます。これで、新しいプロジェクトを作成するときに、C ++サポートを選択するだけで問題ありません。

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

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


1
* .soを(モジュール)/ src / main / jniLibsに配置します
fawkes

なぜデバッグビルドでも上で、Androidのメーカーを使用しているときNDEBUGが常にセットである
pt123

35

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

現在、プレビューは終了しており、誰でも利用できます。 https //developer.android.com/studio/projects/add-native-code.html

古い答え:Gradle ndk-buildは、jniプロジェクトソースにディレクトリます。

これはAndroid Studio 0.5.9(カナリアビルド)で動作しています。

  1. NDKをダウンロードする

  2. ANDROID_NDK_HOME環境変数に追加するか、Android Studioプロジェクトに追加ndk.dir=/path/to/ndkしますlocal.properties。これにより、Androidスタジオでndkを自動的に実行できます。

  3. 最新のGradleサンプルプロジェクトをダウンロードして、ndkプロジェクトの例をご覧ください。(これらはページの下部にあります)。良いサンプルプロジェクトはndkJniLibです。

  4. gradle.buildNDKサンプルプロジェクトからをコピーします。こんな感じになります。これgradle.buildにより、アーキテクチャごとに異なるAPKが作成されます。build variantsペインを使用して、必要なアーキテクチャを選択する必要があります。 バリアントペインの構築

    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ファイルは無視されます。回避策として、gradleにatuomatic ndk-build呼び出しを無効にするように指示してから、ndkソースのディレクトリを手動で指定できます。

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
}

はい。しかし、これはUnixプラットフォームでのみ機能し、非常に単純なndk構成/メイクファイルよりも複雑な場合にも制限されます。
plaisthos 2014

はい、gradleビルドファイルで設定できる限られたもののメイクファイルを自動生成しますが、回避策があります。回答に追加しました。
サイプレスフランケンフェルト2014年

1
ndk-buildの呼び出しは、Android Studio内からではなく、コマンドラインでのみ機能します。
Cameron Lowell Palmer

これは最新の答えではありませんが、最も正確であると思われます。ステップ3:「最新の Gradleサンプルプロジェクトをダウンロードする」に特に注意してください。
Sean Beach、

4
tasks.all { task -> if (task.name.contains('Ndk')) task.enabled = false }
IDE

23

「gradle 1.11 com.android.tools.build:gradle:0.9.+」がビルド前のndkをサポートするようになりました。*。soをsrc / main / jniLibsディレクトリに置くだけです。gradleをビルドすると、ndkが適切な場所にパッケージ化されます。

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

事業:
| --src
|-| --main
|-|-| --java
|-|-| --jniLibs
|-|-|-| --armeabi
|-|-|-|-|-。soファイル
| --libs
|-| --other.jar


16

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

  1. Android NDKをダウンロードし、ルートフォルダーを適切な場所に配置します。

  2. 以下をlocal.propertiesファイルに追加します。 ndk.dir=<path-to-ndk>

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

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

  5. そのフォルダ内に、というファイルを作成しますhello-world.c。このファイルを以下に示します。

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


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を除く)。


現在のプロジェクトで指示されているとおりに作業していますが、NDKのものはまだビルドされていません。何か案は?それは他のすべてを構築しているように見えますが、jni関連のものをスキップしています。
alice.harrison 14

@NannuoLeiありがとう、試してみましたが、.soが生成されないという問題が発生しています。それ以外はすべて機能しているようですが、エミュレータでapkgを実行すると、共有オブジェクトを読み込めないというメッセージが表示されます。
aaa90210 2015年

@ aaa90210エミュレータはx86イメージに基づいていますか?デフォルトでは、NDKはARMEABIライブラリを生成するだけです。x86イメージをビルドする場合は、次の行をApplication.mkに追加できます。APP_ABI:= armeabi x86
LeoはMonica

1
それは私と一緒に働いた。PS:この答えを見た人はJava_me_mattlogan_ndktest_MainActivity_stringFromJNI、自分のものに変更することを忘れないでください:)
AbdulMomenعبدالمؤمن

8

UNIXを使用している場合は、最新バージョン(0.8)でndk-buildが追加されます。追加する方法は次のとおりです。

android.ndk {
    moduleName "libraw"
}

それは 'src / main / jni'の下に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)
}

1
その機能に関するドキュメントはありますか?何も見つかりませんでした。現時点では、Android.mk / Application.mkを完全に無視しているようです。
plaisthos 2014年

見つかりませんでした。ハーフベイクしたビルドに潜入している可能性があります。私はWindowsを使用しているので、UNIXのndk-buildスクリプトを呼び出そうとして失敗したことのみを確認できます。ネイティブコンパイルをGradleに統合するためにそれを呼び出す理由は他にありません。あなたはunixにいますか?
Anthony


実際には、jniLibs.srcDirsでビルド済みの* .soファイルが見つかることを期待しています
Alpine

ビルドされたライブラリが必要な場合は絶対に必要ないndk-buildの呼び出しがクラッシュするという事実に基づいて、私は同意しません。現時点でLinuxをvmする時間がないため、確認できません。
アンソニー14

7

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

基本的に、「lib / armeabi / yourlib.so」を含むjarを作成し、そのjarをビルドに含めます。


うん。これは、ネイティブコードを頻繁に変更しない場合にのみ機能します。そして、リポジトリーにバイナリーjarファイルを含める必要があります。そうしないと、jarをその場で作成するビルドスクリプトが作成されます。
plaisthos 2013

1
私はAndroidのHello-JNIの例を、ラップし、それぞれのを生成し、gradleのビルドパスに配置してこの痛みを軽減する単純なbashスクリプトで変更しました。見てみな。ndk-build.jar.so
dbro 2013年

4

すぐにコンパイルされる.soファイルのパッケージ化を自動化する良い答えは、別の(閉じた)スレッドで与えられます。これを機能させるには、行を変更する必要がありました。

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

に:

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

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


更新:新しいAndroid Studio(少なくとも1.5)では、ネイティブコードがより適切に組み込まれており、コードをパッケージ化するためにこの個別のタスクを実行する必要がないことに注意してください。
HYS、

4

@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'

3

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

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

次のコードを使用してネイティブ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)
}


1

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

Android Gradleプラグイン0.7でNDKを構成する方法

この投稿には、ビルド済みのネイティブライブラリをさまざまなアーキテクチャのアプリにリンクする方法の詳細と、NDKサポートをbuild.gradleスクリプトに直接追加する方法に関する情報が含まれています。ほとんどの場合、zipとコピーに関する作業を行う必要はもうありません。


1

Android StudioプロジェクトでNDKを機能させるために使用した手順は次のとおりです。私はこのチュートリアルを使用して私を助けました 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

cFlagsはまだ私にとってはある程度の黒魔術です。私はすべてのオプションとそれらが私に与えるもののための良い情報源を見つけていません。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

EclipseからAndroid Studioでプロジェクトを構成する:GradleにエクスポートせずにEclipse NDKプロジェクトをAndroid Studioにインポートする必要があり、それは機能します。また、local.propertiesにNDKのパスを追加する必要があり、エラーが表示された場合は追加します

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

build.gradleファイルその後、作成JNIターミナル使用して、フォルダやファイルを、それが動作する実行


1
私自身の答えを見てください。それは私が現在使用している回避策ですが、実際の解決策ではありません。
plaisthos 2014年

1

Android Studioが安定したチャネルに入ったので、android-ndkサンプルを実行するのは非常に簡単です。これらのサンプルは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、native-codec、およびビルダーを除くすべてのプロジェクトをリポジトリーに正常にビルドしてデプロイしました。私は以下を使用しています:

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


1

NDKビルドとGradle(基本)

通常、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 User Guideをご覧ください。

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

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

共有ライブラリの構築

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


0

この行をアプリに追加するだけです 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)
}

私はjniLibs.srcDirsアプローチがabFilter / flavoursを使用できるのでこれよりもクリーンだと思いますが、あなたのアプローチも機能するはずです。
plaisthos 14

0

今、私はとても成功してロードできます!

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
  1. プロジェクトがEclipseからエクスポートされた場合、gradleファイルに以下のコードを追加します。

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

2.Androidスタジオでプロジェクトを作成する場合:

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

そしてgradleファイルに以下のコードをコピーしてください:

android {
    sourceSets{  
       main{  
         jniLibs.srcDir['jniLibs']  
      }  
    }
}

0

私はSJoshi(オラクル男)が最も完全な答えを持っていると思いますが、SWIGプロジェクトは特別なケースであり、面白くて便利ですが、標準のSDK antベースのプロジェクトでうまく機能している大多数のプロジェクトには一般化されていません+ NDK。私たちは皆、Androidスタジオを使用する可能性が最も高いか、理論上はGradleが提供するモバイル向けの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ファイルを作成するための時間と労力を無駄にしないようにします。構築するターゲットアーチを制御します。また、これらの手順はWindowsユーザーに優しく、理論的には特別な問題なしにWindows上で構築できるはずです。

Gradle for Androidは、私が借用したMavenの概念とプロジェクトのディレクトリの構造の見た目が好きなように、私の意見では混乱しています。このNDK機能は、ほぼ3年以上「間もなく登場」します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.