如何在Android.mk中使用gradle变量?

时间:2017-09-18 16:21:55

标签: android git opencv android-gradle

请问,我想知道如何使用从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

我真的很感激任何帮助!

3 个答案:

答案 0 :(得分:1)

RecyclerView B = ((MyAdapter.MyViewHolder)A .findfindViewHolderForAdapterPosition(posB)) .getRecyclerViewB(); B.scrollToPosition(B.getAdapter().getItemCount()-1); 中进行设置应该可以。您是否尝试注销并登录?

我正在/etc/profile.d/my_proj.sh中设置OPENCVROOT,它在~/.profile内部可见,用于gradle和ndk-build。 只需记住Android.mk中进行设置即可,该设置仅用于终端子外壳,而不是从Android Studio通常从GUI启动的程序。

答案 1 :(得分:0)

我终于想通了,希望这会帮助你或其他有类似问题的人。

我将此添加到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

答案 2 :(得分:0)

我意识到,我的方法和您一样。通过在描述配置时作为参数传递,可以与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