Как добавить 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, такие как массивы и строки