【发布时间】:2018-08-08 01:20:55
【问题描述】:
您好,
我在一个包含大量 C++ 文件的项目中使用带有 NDK 和 JNI 的 Android Studio。当我在单个 C++ 文件中进行更改时 除非我重建整个项目并刷新整个项目,否则它将不适用于代码 C++ 文件,因此它们必须重新编译。每次小改动编译过程都需要 3 多分钟,一天做 20 次,你就损失了一个小时。
根据今天,在我对文件进行更改后,我会去
构建 >> 刷新链接的 C++ 项目,
然后运行项目,从而对所有文件进行完整、冗余的编译。
我正在寻找方法让编译器仅刷新更改的文件,从而缩短构建过程。
注意:这个问题只出现在windows中,当我在Mac上运行Android Studio时,编译器只重新编译相关文件。
这是我的 CMakeLists.txt 文件:
cmake_minimum_required(VERSION 3.4.1)
FILE(GLOB CPP_SRC
"src/main/cpp/*.c"
"src/main/cpp/*.h"
"src/main/cpp/*.cpp"
"src/main/cpp/*.hpp"
)
add_library(MyLib
SHARED
${CPP_SRC} )
find_library(
log-lib
log )
target_link_libraries(
MyLib
${log-lib} )
target_link_libraries(MyLib
android
log
EGL
GLESv2)
还有我的 gradle.build 文件:
apply plugin: 'com.android.library'
android {
signingConfigs {
config {
keyAlias '*****'
keyPassword '*****'
storeFile file(*****)
storePassword '*****'
}
}
compileSdkVersion 27
buildToolsVersion '27.0.3'
defaultConfig {
minSdkVersion 16
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang", "-DANDROID_STL=c++_shared", "-DCMAKE_BUILD_TYPE=Release", "-DANDROID_CPP_FEATURES=rtti exceptions"
cppFlags "-D__STDC_FORMAT_MACROS", '-Ofast', '-fsigned-char', "-std=c++14", "-frtti", "-fexceptions", "-mtune=arm7", "-mfpu=vfpv3-d16", "-mfloat-abi=softfp", "-Wall",
"-DCOMPILE_EUROPE_ID_AND_FACE_OCR_MANAGER",
"-DCOMPILE_FRENCH_PASSPORT_SIGNATURE",
"-DCOMPILE_FRENCH_ID_BACK_OCR",
"-DCOMPILE_FRENCH_PASSPORT_SIGNATURE_MANAGER",
"-DCOMPILE_PASSPORT_AND_FACE_OCR_MANAGER",
"-DCOMPILE_MRZ_OCR",
"-DCOMPILE_FRENCH_ID_BACK_OCR_MANAGER"
}
ndk {
abiFilters 'x86', 'armeabi-v7a'
}
}
splits {
abi {
enable true
reset()
include 'x86', 'armeabi-v7a'
universalApk true
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
signingConfig signingConfigs.config
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
libraryVariants.all { variant -> variant.outputs.all { output ->
outputFileName = "${"libScanovateImaging"}.aar" }
}
}
allprojects {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
}
dependencies {
implementation 'com.google.android.gms:play-services-vision:15.0.0'
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support.constraint:constraint-layout:1.1.0-beta6'
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:design:27.1.1'
}
提前致谢!
【问题讨论】:
-
可能是您项目的Application.mk 或Android.mk 文件有问题。对 Android Studio 了解不够,无法确定。
-
如果 Windows 上的这种错误行为只发生在 Android Studio 中,但命令行 ndk-build 或 cmake 可以正确进行部分重新编译,则可以运行终端窗口中的本地构建(确保使用与 AS 完全相同的路径和参数)。
-
您的
minifyEnabled true文件中有minifyEnabled true属性吗? -
这可能是因为
GLOB吗?我的意思是,如果您明确列出源文件,这可能会得到解决。而且我认为您不需要${CPP_SRC}中的.h和.hpp文件 -
您的
build.gradle文件中有错字(libraryVariants.all的花括号过多)。我已经测试了两个ABIs和ndkBuild是否正确(请参阅更新的答案-> 结构)。splits没问题。正如link 所建议的那样,它必须是您的CMakeLists.txt。像我一样展示你的结构(它将在不同的地方)。
标签: android android-studio android-ndk java-native-interface