2 votes

Définir le drapeau Android.mk à travers Gradle en fonction du type de construction

J'ai besoin de mettre un drapeau dans Android.mk qui indique au code C s'il est en mode débogage ou non.

LOCAL_MODULE := auth
LOCAL_SRC_FILES := auth.c
LOCAL_CFLAGS := -DDEBUG_MODE=0
LOCAL_EXPORT_CFLAGS := $(LOCAL_CFLAGS)
LOCAL_LDLIBS := -llog
LOCAL_C_INCLUDES := auth.h

include $(BUILD_SHARED_LIBRARY)

Le problème est que j'oublie souvent de modifier la valeur lors de la création d'une version et vice-versa. J'attends donc avec impatience une méthode qui le fasse automatiquement.

J'ai essayé de changer Android.mk à :

LOCAL_CFLAGS := -DDEBUG_MODE

Et a changé le build.gradle à ce qui suit :

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 25
    }

    buildTypes {
        release {
            debuggable false
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            ndk {
                cFlags = " -DDEBUG_MODE=0 "
            }
        }
        debug {
            debuggable true
            minifyEnabled false
            shrinkResources false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            ndk {
                cFlags = " -DDEBUG_MODE=1 "
            }
        }
    }

    sourceSets.main {
        jni.srcDirs = ['src/main/none']
        jniLibs.srcDirs = ["src/main/libs"]
    }

    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }
    return void
}

Ce n'était pas suffisant, le drapeau ne change pas en fonction du type de construction. J'ai trouvé peu d'informations à ce sujet et le code ci-dessus est le résultat de ce que j'ai lu sur internet. Avez-vous une suggestion sur la façon de le faire fonctionner correctement ?

1voto

Michael Points 18419

Utilisez externalNativeBuild { ndkBuild { dans le type de construction. Notez que les drapeaux seront ajoutés à APP_CFLAGS (c'est-à-dire tous les modules), et non pas LOCAL_CFLAGS .

build.gradle :

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.ndkbuildtest"
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            ndkBuild {
                abiFilters "armeabi-v7a"
                arguments "APP_STL:=gnustl_static"
                cppFlags "-std=c++11","-frtti","-fexceptions"
            }
        }
    }
    buildTypes {
        release {
            externalNativeBuild {
                ndkBuild {
                    cFlags "-DDEBUG_MODE=0"
                }
            }
        }
        debug {
            externalNativeBuild {
                ndkBuild {
                    cFlags "-DDEBUG_MODE=1"
                }
            }
        }
    }
    externalNativeBuild {
        ndkBuild {
            path "Android.mk"
        }
    }
}

Android.mk :

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := native-lib
LOCAL_SRC_FILES := src/main/cpp/native-lib.cpp
include $(BUILD_SHARED_LIBRARY)

native-lib.cpp :

#include <jni.h>
#include <string>

#if DEBUG_MODE
#error "Debug mode enabled!
#endif

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_ndkbuildtest_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

0voto

JavadKhan Points 460

Vous pouvez le faire dans votre fichier Application.mk avec juste ces quelques lignes.

## DEBUG MODE
APP_ABI := armeabi-v7a  #Add your target ABI's or change, it's up to you.
APP_CFLAGS += -UNDEBUG -O0 -g -ggdb 
APP_OPTIM := debug
APP_CPPFLAGS += -DDMZ_DEBUG=1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X