请问,我想知道如何使用从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
我真的很感激任何帮助!
答案 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