2015-09-07 34 views
17

これに関連する回答はあるものの、古くて古くなっています。私はAndroidスタジオ1.3を持っていて、すでにAndroid NDKをダウンロードしています。アプリを実行するとクラッシュし、findLibrary returned nullLogcatと表示されます。私はこれがライブラリファイル.so(私が間違っている場合は私を訂正する)のせいであると考えました。私の質問は - Android Studioで.soファイルを生成する方法は?Android Studioで.soファイルを生成する

私が持っているもの

-

  • のAndroid Studioの1.3の安定版
  • のGradle 1.5
  • Androidの実験のプラグイン0.2

お知らせ -ライブラリ.soファイルがある場合はCygwinまたは0123から構築する、どうすればいいか教えてください。

+0

スタジオ2.1を使用して.soファイルを生成できましたか? – Hunt

答えて

12

NDKをAndroidスタジオに接続するには、いくつかの手順が必要です。現在、サポートは実験とマークされており、ASはIDE内でNDKをダウンロードする機能をバンドルし始めています。デフォルトでは、またはjniLibsフォルダにソースおよび/またはライブラリが置かれている場合、ASは一般的なAndroid.mkApplication.mkを使用します。以下の手順は、より多くのカスタマイズ機能を提供するために、これらのデフォルトを上書きします。要するに

、あなたがする必要があります:あなたのソースとLIBSのデフォルトjnijniLibsディレクトリを作成

  1. いくつかのソース
を作成し、建物を指定する Android.mkファイルを作成し、あなたのNDKをコンパイルすると、どこ
  • あなたのlibsを配置する方法のGradle伝えるチェーン
  • を構築見つけるためにどこのAndroidメーカーに知らせると
  • 順序を結びます

    作成したディレクトリ

    /app/src/mainの内部にjnijniLibsというディレクトリを作成します。あなたのlocal.propertiesファイル内の

    更新local.properties

    、のような行を追加します。これは、モジュールレベルを指し

    build.gradle

    ndk.dir=/home/nathan/development/bin/android-ndk-r10e

    更新アプリケーションレベルではありません。これにより、上記の手順でビルドパスを定義し、Android Studioがndk-buildを自動的に起動する機能を削除します。次の例を参考にしてください。

    apply plugin: 'com.android.model.application' 
    
    model { 
    android { 
        compileSdkVersion = 23 
        buildToolsVersion = "23.0.0" 
    
        defaultConfig.with { 
         applicationId = "com.example.hellojni" 
         minSdkVersion.apiLevel = 4 
         targetSdkVersion.apiLevel = 23 
        } 
    } 
    
    compileOptions.with { 
        sourceCompatibility=JavaVersion.VERSION_1_7 
        targetCompatibility=JavaVersion.VERSION_1_7 
    } 
    
    /* 
    * native build settings 
    */ 
    android.ndk { 
        moduleName = "hello-jni" 
        /* 
        * Other ndk flags configurable here are 
        * cppFlags += "-fno-rtti" 
        * cppFlags += "-fno-exceptions" 
        * ldLibs = ["android", "log"] 
        * stl  = "system" 
        */ 
    } 
    android.buildTypes { 
        release { 
         minifyEnabled = false 
         proguardFiles += file('proguard-rules.txt') 
        } 
    } 
    android.productFlavors { 
        // for detailed abiFilter descriptions, refer to "Supported ABIs" @ 
        // https://developer.android.com/ndk/guides/abis.html#sa 
        create("arm") { 
         ndk.abiFilters += "armeabi" 
        } 
        create("arm7") { 
         ndk.abiFilters += "armeabi-v7a" 
        } 
        create("arm8") { 
         ndk.abiFilters += "arm64-v8a" 
        } 
        create("x86") { 
         ndk.abiFilters += "x86" 
        } 
        create("x86-64") { 
         ndk.abiFilters += "x86_64" 
        } 
        create("mips") { 
         ndk.abiFilters += "mips" 
        } 
        create("mips-64") { 
         ndk.abiFilters += "mips64" 
        } 
        // To include all cpu architectures, leaves abiFilters empty 
        create("all") 
    } 
    } 
    

    Android.mk

    あなたはいくつかの素晴らしいC/C++のソースコードを追加します。/app/src/main/jniディレクトリ

    LOCAL_PATH := $(call my-dir) 
    
    # Builds a dylib out of test.cpp 
    include $(CLEAR_VARS) 
    LOCAL_MODULE := test 
    LOCAL_SRC_FILES := test.cpp 
    LOCAL_LDLIBS := -llog 
    include $(BUILD_SHARED_LIBRARY) 
    

    TEST.CPP

    内部Android.mkファイルが必要になりますあなたのライブラリのために。これらのファイルは、/app/src/main/jniに開始され、コンパイルして実行

    #include <jni.h> 
    #include <android/log.h> 
    
    static const char *SOME_TAG = "MyAwesomeTag"; 
    
    extern "C" 
    { 
    
    void 
    Java_com_something_something_1android_ClassName_some_fn(JNIEnv *env, jobject obj) 
    { 
        __android_log_print(ANDROID_LOG_VERBOSE, SOME_TAG, "Hello from NDK :)"); 
    } 
    
    } // End extern 
    

    を提出あなたのAndroid.mk

    例に指定されているコンパイルとリンクされます。

  • +1

    あなたが与えた 'Gradle'コードは、古いAndroidプラグイン用です。新しい 'Experimental plugin'は異なる' Gradle'レイアウトを持っています。 'Gradle'コードを更新していただけますか?しかし、答えをありがとう。 – FadedCoder

    +0

    新しい 'Gradle'コードでこれを編集してください。 – FadedCoder

    +0

    @AUnknownHacker必ずしも古いものと新しいものとの編集ではありません。多かれ少なかれ、自分のものにgradleやmakefileを使いたいと思っています。また、API 4は、これらのトリプルの一部やJava v1.7ではビルドされません。 – nathansizemore

    6

    Android Studio 2.2以降で1年以上経ってから、新しいプロジェクトを作成するときに「Include C++ Support」を選択するだけで、すべて無料で完了できます。

    詳細については、https://developer.android.com/studio/projects/add-native-code.htmlをご覧ください。

    +0

    ええと、長時間のうちに、Android StudioはついにNDKの完全なサポートを追加しました:) – FadedCoder

    関連する問題