如何在Android.mk文件中使用Gradle变量?

3

请问如何在Android.mk文件中使用在gradle中定义的变量?或者有没有其他方式可以将gradle中的变量传递到Android.mk中呢?

我知道这个问题看起来很奇怪,但是我尝试了很多可能性都没有成功。

实际上,我正在与同学合作开发项目,我们使用OpenCV和其他类型的库。问题是大部分这些库的路径根据开发者的计算机而变化。因此,由于我们使用git,这些文件经常发生冲突。

为了解决这个问题,我首先在/etc/profile.d/my_proj.sh文件中使用环境变量,但并没有成功。所以我创建了一个属性文件,在其中放置了所有这些路径,并编写了一个函数来读取该文件并获取这些值在build.gradle文件中。现在我想知道如何与Android.mk文件共享这些变量。

下面是我分享给您的代码,包括在build.gradle文件中的函数。

apply plugin: 'com.android.library'
import org.apache.tools.ant.taskdefs.condition.Os

def Properties props = new Properties()
def propFile = file('/etc/profile.d/my_proj.properties')   //pay attention to the path
def opencvRoot;
if (propFile.canRead()){
    props.load(new FileInputStream(propFile))
    println(props)

    if (props!=null && props.containsKey('OPENCVROOT')) {
        opencvRoot = props['OPENCVROOT']
        println("opencvRoot = ${opencvRoot}")
    }else{
        println("Doesn't contains opencvRoot = ${opencvRoot}")
    }
}else{
    println("I can't read opencvRoot = ${opencvRoot}")
}

android {
    compileSdkVersion versionCompiler
    buildToolsVersion versionBuildTool

    defaultConfig {
        minSdkVersion 18
        targetSdkVersion versionTarget
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        externalNativeBuild {
            ndkBuild {
                arguments "OPENCV_ROOT:=${opencvRoot}"
            }
        }

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

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

Android.mk文件
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#opencv
OPENCVROOT := $(OPENCV_ROOT) # This doesn't work
# OPENCVROOT:= /home/username/OpenCV-android-sdk

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk

我非常感激任何帮助!


我知道这是一个旧贴子,但你解决过这个问题吗? - Treyten Carey
还没有!即使现在我也无法弄清楚如何做这个。非常感谢任何帮助。我们(我和我的团队)必须在Android.mk文件中设置默认路径,这样任何人都可以根据自己的配置更改内容,但不允许推送该文件。 - Erman
3个回答

1

我终于弄明白了,希望这能帮到你或其他遇到类似问题的人。

我将以下内容添加到我的build.gradle文件的末尾:

task ndkBuildCompile(type:Exec) {
    commandLine("${project.ext.ndk_dir}${File.separator}ndk-build",
                "OPENCVROOT=${opencvRoot}")
}

然后在Android.mk中,我可以像平常一样引用它,就像这样:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED

# This now WORKS
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk

1
/etc/profile.d/my_proj.sh中设置应该可以工作。您尝试过注销并登录吗?
我正在~/.profile中设置我的OPENCVROOT,并且在gradle和ndk-build的Android.mk中可见。 只需记住不要~/.bashrc中设置它,因为这仅适用于终端子shell而不是从GUI启动的程序(如Android Studio)。

1

我意识到,我的方法和你的一样。通过在描述配置时传递参数,可以与 Android.mk 共享变量。你应该确保 opencvRoot 变量符合预期。 在 build.gradle 中。

android{  
   defaultConfig   {  
      externalNativeBuild      {  
         ndkBuild         {  
            arguments "GRADLETESTVARIABLE="+buildEmulator
         }
      }
   }
}

在Android.mk中

ifeq ($(GRADLETESTVARIABLE),true)
TEST_VARIABLE:=$(GRADLETESTVARIABLE)
$(error the error is f $(TEST_VARIABLE))
else
TEST_VARIABLE:=$(GRADLETESTVARIABLE)
$(error the error is l $(TEST_VARIABLE))
endif

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