web-dev-qa-db-ja.com

JNI(C / C ++ネイティブコード)を既存のAndroid Studioプロジェクトに追加する方法

タイトルが言っているように-既存のAndroid Studioプロジェクトにネイティブコードを追加する方法、グラドルとプロガード設定を含む現在のプロジェクトを壊さずに?

15
Vladimir

既存のプロジェクトから次の手順を実行します。

1. build.gradle(モジュールアプリ)を次のように変更します(大幅に変更されました!)。

    apply plugin: 'com.Android.model.application'

    model {
        Android.signingConfigs {
            create ("myConfig") {
                keyAlias '--your-key-alias--'
                keyPassword '--key-password--'
                storeFile file('--/path/to/keystore.jks--')
                storePassword '--store-password--'
            }
        }
        Android {
            compileSdkVersion 25
            buildToolsVersion '25.0.2'

            defaultConfig {
                applicationId "--your.app.name--"
                minSdkVersion.apiLevel 19
                targetSdkVersion.apiLevel 25
                versionCode 1
                versionName "1.0"
            }
            buildTypes {
                release {
                    minifyEnabled true
                    proguardFiles.add(file('proguard-Android-optimize.txt'))
                    proguardFiles.add(file('proguard-rules.pro'))
                    signingConfig = $("Android.signingConfigs.myConfig")
                }
            }
            ndk {
                moduleName "--c-file--"
                ldLibs.addAll(["Android", "log"])
            }

        }
        Android.dexOptions {
            javaMaxHeapSize "2048m"
        }
    }

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.Android.support:appcompat-v7:25.3.1'
    }

上記のコードをコピーして貼り付け、少なくとも「--value--」で値を変更して自分のものに一致させることができます。

2. build.gradleの変更(プロジェクト)

このようなことを言うところ:

dependencies {
    classpath 'com.Android.tools.build:gradle:2.3.3'
}

これに:

dependencies {
    classpath 'com.Android.tools.build:gradle-experimental:0.9.3'
}

私の例の数字0.9.3はgradle-experimentalの最新バージョンです here 。最終的に、gradle-wrapper.propertiesのgradleバージョンをAndroid Studioで推奨されていない場合はStudioが推奨するバージョンに変更します。

3. proguard設定ファイルを移動します

proguard-Android-optimize.txtからapp/proguard-Android-optimize.txt

4. Javaからの呼び出しを追加します

このような

static {
    System.loadLibrary("--c-file--");
}
private native byte my_jni(Context context, byte[] mByte, int i);

ニーズに合わせて変更します。上記の例は、Cファイル(拡張子なしで書き込み)を読み込みます-gradleファイルで宣言されたものと同じで、関数my_jniを呼び出して、アプリケーションのコンテキスト、バイト配列、およびintを渡し、関数がバイトを返すことを期待します。

5. JNIで関数を作成します。

これで、関数の名前が赤で強調表示されます-Android Studioで作成できますCreate function ...行の赤いランプをクリックして。これにより、cファイルに関数が作成され、フォーカスが変更されます。

完了

さらに読む ここ

ヒント:

  • free、すべてのmallocなど、ReleaseByteArrayElementsGetByteArrayElementsなどすべてに注意してください

  • 配列や文字列など、いくつかのdangerous値をCからJavaに適切に返す方法に注意してください

6
Vladimir

Android Studio 3.1の簡単な方法:

1。 app\src\main内にcppフォルダーを作成します。

2。 <YOUR_FILE_NAME>.cppパスにapp\src\main\cppファイルを作成します(例:native-lib.cpp)

3。 CMakeLists.txtファイルをappフォルダーに追加します。

ライブラリのそのファイル名で、.cppファイルパスとその他の設定を定義する必要があります。 (新しい、空のAndroid C++をサポートするStudioプロジェクトから):

# For more information about using CMake with Android Studio, read the
# documentation: https://d.Android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp )
                          ^^^^^^^^^^^^^^
                          YOUR_CPP_FILE_NAME

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

4。 build.gradle(モジュールアプリ)externalNativeBuildCMakeLists.txtを参照してAndroidセクションに追加します:

Android {
    compileSdkVersion 26
    defaultConfig {
        ...
    }
    buildTypes {
        ...
    }
    externalNativeBuild {               <--- these lines should be added
        cmake {                         <--- these lines should be added
            path "CMakeLists.txt"       <--- these lines should be added
        }                               <--- these lines should be added
    }                                   <--- these lines should be added
}

5。 build.gradle(モジュールアプリ)externalNativeBuildタグとcmakeタグをdefaultConfigセクションに追加:

...
defaultConfig {
    applicationId "<YOUR_APP_ID>"
    minSdkVersion 26
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"


    externalNativeBuild {   <--- these lines should be added
        cmake {             <--- these lines should be added
            cppFlags ""     <--- these lines should be added
        }                   <--- these lines should be added
    }                       <--- these lines should be added
}
...

( "basic" build.gradleファイルの例は、新しい空のAndroid C++をサポートするStudioプロジェクトでも利用可能)

6。プロジェクトをGradleファイルと再同期します

プロジェクトの同期をクリックして Sync Project button on Toolbar ツールバーで。 NB! Android Studio 3.3では、アイコンは  Android Studio 3.3 Sync Project button on Toolbar

また、 公式チュートリアル もご覧ください。

PS。ファイルがcppフォルダーに表示されない場合:

File/Invalidate Caches & RestartThinh V のコメントに記載されているように試してください。

25