web-dev-qa-db-ja.com

Android Studioで.soファイルを生成

これに関連する回答があることは承知していますが、それらは古くて時代遅れです。 Android St​​udio 1.3を入手し、既にAndroid NDKをダウンロードしました。アプリを実行すると、クラッシュし、LogcatfindLibrary returned nullが表示されます。これは.soライブラリファイルがないためであることがわかりました(間違っている場合は修正してください)。私の質問は-Android St​​udioで.soファイルを生成するにはどうすればよいですか?

私が持っているもの-

  • Android Studio 1.3安定版
  • Gradle 1.5
  • Android Experimental Plugin 0.2

注意-ライブラリ.soファイルをCygwinまたはCMDから構築する必要がある場合、その方法を教えてください。

20
FadedCoder

NDKをAndroid Studioに接続するには、いくつかの手順が必要です。現在、サポートはexperimental ASは、IDE内でNDKをダウンロードする機能をバンドルし始めています。デフォルトでは、ASは、ソースまたはライブラリ(あるいはその両方)がjniに配置されている場合、汎用Android.mkおよびApplication.mkjniLibsフォルダー:以下の手順は、より多くのカスタマイズ機能を提供するために、これらのデフォルトをオーバーライドします。

要するに、あなたはする必要があります:

  1. ソースとライブラリ用のデフォルトのjniおよびjniLibsディレクトリを作成します。
  2. Android StudioでNDKビルドチェーンの場所を確認してください
  3. Gradleにコンパイル方法とライブラリの配置場所を教えてください
  4. Android.mkファイルを作成して、ビルドとリンクの順序を指定します
  5. ソースを作成する

ディレクトリの作成

/app/src/main内にjniおよびjniLibsディレクトリを作成します。

local.propertiesの更新

local.propertiesファイル内に、次のような行を追加します。

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

build.gradleの更新

これは、アプリケーションレベルではなく、モジュールレベルを指します。これにより、上記の手順でビルドパスを定義し、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

Android.mkディレクトリ内に/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

LibにすばらしいC/C++ソースコードを追加します。これらのファイルは/app/src/main/jniで始まり、Android.mkで指定されたとおりにコンパイルおよびリンクされます

サンプルファイル

#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

コンパイルして実行します。

16
nathansizemore

1年後Android Studio 2.2以降では、新しいプロジェクトを作成するときに[C++サポートを含める]を選択するだけで、これらすべてを無料で完了できます。

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

9
Arthur