Как добавить JNI (родной код C / C++) в существующий проект Android Studio

Как говорится в названии - как добавить собственный код в существующий проект Android Studio, не нарушая текущий проект, включая настройки gradle и proguard?

1 ответов


выполните следующие действия из существующего проекта:

1. Изменить сборку.gradle (модуль app), чтобы выглядеть так (много изменений!):

    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. Изменить сборку.gradle (Project)

где написано что-то вроде этого:

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 to be found здесь. В конце концов измените версию gradle в gradle-обертка.свойства к версии, рекомендованной Android 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-файл (write it without the extension) - тот же самый, объявленный в файле gradle, и вызывает функцию my_jni, передавая контекст приложения, некоторый массив байтов и некоторый int, ожидая, что функции вернут байт.

5. Создайте функцию в JNI:

теперь имя вашей функции выделено красным цветом-разрешить Android Studio создать его Create function ... при нажатии на красную лампу на строки. Это создает функцию в вашем файле c и изменяет фокус на он.

сделал

более дальнеишее чтение здесь.

советы:

  • позаботьтесь о free все malloc, ReleaseByteArrayElements для каждого GetByteArrayElements и так далее

  • позаботьтесь, Как правильно вернуть некоторые опасно значения от C до Java, такие как массивы и строки