根据构建类型通过Gradle设置Android.mk标志

3

我需要在 Android.mk 文件中设置一个标志,告诉 C 代码是否处于调试模式。

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)

问题在于我经常会忘记在构建版本和反之时更改值,因此我希望有一种自动完成这个过程的方式。
我尝试将Android.mk更改为:
LOCAL_CFLAGS := -DDEBUG_MODE

并将build.gradle更改为以下内容:

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
}

这还不够,标志并没有根据构建类型而改变。我在网上找到了一些信息,上面的代码是我读到的结果。

您有关于如何使其正常工作的建议吗?

2个回答

2

在构建类型中使用externalNativeBuild { ndkBuild {。请注意,标志将添加到APP_CFLAGS(即所有模块),而不是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());
}

标志值仍然始终为0(未设置)。但是,无论是在gradle重新同步还是更改构建类型时,我都看不到任何ndk构建过程。 - fillobotto
你在哪里以及如何测试标志的值?请注意,测试LOCAL_CFLAGS是行不通的,因为该标志被添加到APP_CFLAGS中。但是,在C代码中检查标志对我来说效果很好(我正在使用Gradle插件的2.3.1版本)。 - Michael
我从mk文件中删除了 LOCAL_CFLAGS := -DDEBUG_MODE=0,并在C代码中使用 # if DEBUG_MODE 进行测试(gradle 2.3.2)。 - fillobotto
你的 Application.mk 或 Android.mk 中是否有 APP_FLAGS :=?我已经添加了一个更完整的示例,适用于2.3.2(如果我运行 gradlew assembleDebug,则会触发 #error,如果我运行 gradlew assembleRelease,则不会)。 - Michael
我解决了。问题在于 gradle 的 sourceSets 属性,导致项目使用旧的本地预编译库进行编译(这些库通常是通过终端编译的)。删除 gradle 属性可以解决问题。 - fillobotto

0

你可以在 Application.mk 文件中只用这几行代码就能实现。

## 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

请解释代码实际执行的操作,否则将不清楚如何将其与其他代码集成。 - fillobotto
发布模式是默认的,会生成高度优化的二进制文件。调试模式会生成未经优化的二进制文件,这些文件更易于调试。当您添加 APP_OPTIM := debug 行时,它会将源代码生成为可调试状态,并运行所有调试行。请阅读 APP_OPTIM 部分:https://developer.android.com/ndk/guides/application_mk.html 。 - JavadKhan
这并没有解决问题,我仍然需要每次在发布或调试中构建Android项目时更改APP_OPTIM值。我需要一种将Android项目构建类型反映到mk文件中的方法,唯一的方法是通过gradle(也许使用任务?)。 - fillobotto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接