如何预防C++;要在Android NDK中重新编译所有文件?
你好, <>我在一个有大量C++文件的项目中使用了带有NDK和JNI的Android工作室。当我在单个C++文件中进行更改时 除非重建整个项目并刷新整个项目,否则它不会应用于代码中 C++文件,所以它们必须重新编译。编译过程中每做一个小改动都要花费3分钟以上,如果每天修改20次,那么您就损失了一个小时 根据今天的说法,在我更改了一个文件后,我会去 构建>刷新链接的C++项目, 然后运行项目,从而对所有文件进行完整、冗余的编译 我正在寻找一种方法,让编译器只刷新已更改的文件,从而缩短构建过程。 注意:此问题仅在windows中出现,当我在Mac上运行Android Studio时,编译器仅重新编译相关文件 这是我的CMakeLists.txt文件:如何预防C++;要在Android NDK中重新编译所有文件?,android,android-studio,android-ndk,java-native-interface,Android,Android Studio,Android Ndk,Java Native Interface,你好, 我在一个有大量C++文件的项目中使用了带有NDK和JNI的Android工作室。当我在单个C++文件中进行更改时 除非重建整个项目并刷新整个项目,否则它不会应用于代码中 C++文件,所以它们必须重新编译。编译过程中每做一个小改动都要花费3分钟以上,如果每天修改20次,那么您就损失了一个小时 根据今天的说法,在我更改了一个文件后,我会去 构建>刷新链接的C++项目, 然后运行项目,从而对所有文件进行完整、冗余的编译 我正在寻找一种方法,让编译器只刷新已更改的文件,从而缩短构建过程。 注意:
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'
}
提前感谢简介
我认为这是Android Studio(更具体地说是NDK
构建系统)长期以来的一个问题。现在,在最新版本中,它终于准备好并开始工作了(希望如此)
注意:构建速度明显快于使用Android Studio IDE,并且可以使用批处理文件脚本()构建
C制造可能的问题(P=问题,C=原因,S=解决方案)
(P1)Android Studio
如果支持多个ABI,则每次都会重建所有内容。请参阅。(C1)所有构建变体都具有相同的.o文件输出目录。
(S1)您需要将构建目录拆分为release/debug和不同的ABI。
我的设置(ndkBuild)
Android Studio 3.1
,NDK发行版10
,gradle
版本4.4(插件3.1.0)
我有2个库要构建(<代码> LbelHoLoWord。所以 1 C++文件,和<代码> LbjnIIOpEngultEng.So < /Cuff>用24个C++文件)。< /P>
我正在将externalNativeBuild
->ndkBuild
用于我的本机代码(您也可以使用,我还没有测试过)
应用程序级别build.gradle
:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
defaultConfig {
applicationId "xxxxxxxxxxxxxxxxxxxxx"
minSdkVersion 16
targetSdkVersion 16
versionCode 1
versionName "1.0"
ndk {
abiFilters 'armeabi-v7a' //,'x86'
}//ndk
}//defaultConfig
buildTypes {
release {
minifyEnabled true
proguardFiles.add(file('proguard-android-optimize.txt'))
proguardFiles.add(file('proguard-rules.pro'))
}//release
debug {
minifyEnabled false
jniDebuggable true
renderscriptDebuggable true
}//debug
}//buildTypes
externalNativeBuild {
// Encapsulates your CMake build configurations.
// cmake {
// // Provides a relative path to your CMake build script.
// path "src/main/cpp/CMakeLists.txt"
// }
ndkBuild {
//****this is the working build****
path 'src/main/cpp/Android.mk'
}//ndkBuild
}//externalNativeBuild
}//android
dependencies {
}//dependencies
APP_ABI := armeabi-v7a
APP_PLATFORM := android-19
APP_STL := stlport_static
#================================================
LOCAL_PATH := $(call my-dir) #only call it ONCE !
#================================================
include $(CLEAR_VARS)
LOCAL_MODULE := hello_world
LOCAL_MULTILIB := 32
LOCAL_SRC_FILES := hello_world.cpp
include $(BUILD_SHARED_LIBRARY)
#================================================
include $(CLEAR_VARS)
LOCAL_MODULE := libjni_photoeditor
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := libm liblog libjnigraphics
LOCAL_LDLIBS := -lm -llog -ljnigraphics -lbcc
LOCAL_LDLIBS := -lm -llog -ljnigraphics
LOCAL_SRC_FILES := _jni.cpp utils.cpp quantize.cpp #etc.. 24 files
LOCAL_CFLAGS := -Werror \
-I$(OUT)/../../../../frameworks/compile/libbcc/include
LOCAL_LDFLAGS := -L$(OUT)/system/lib
include $(BUILD_SHARED_LIBRARY)
Application.mk
:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
defaultConfig {
applicationId "xxxxxxxxxxxxxxxxxxxxx"
minSdkVersion 16
targetSdkVersion 16
versionCode 1
versionName "1.0"
ndk {
abiFilters 'armeabi-v7a' //,'x86'
}//ndk
}//defaultConfig
buildTypes {
release {
minifyEnabled true
proguardFiles.add(file('proguard-android-optimize.txt'))
proguardFiles.add(file('proguard-rules.pro'))
}//release
debug {
minifyEnabled false
jniDebuggable true
renderscriptDebuggable true
}//debug
}//buildTypes
externalNativeBuild {
// Encapsulates your CMake build configurations.
// cmake {
// // Provides a relative path to your CMake build script.
// path "src/main/cpp/CMakeLists.txt"
// }
ndkBuild {
//****this is the working build****
path 'src/main/cpp/Android.mk'
}//ndkBuild
}//externalNativeBuild
}//android
dependencies {
}//dependencies
APP_ABI := armeabi-v7a
APP_PLATFORM := android-19
APP_STL := stlport_static
#================================================
LOCAL_PATH := $(call my-dir) #only call it ONCE !
#================================================
include $(CLEAR_VARS)
LOCAL_MODULE := hello_world
LOCAL_MULTILIB := 32
LOCAL_SRC_FILES := hello_world.cpp
include $(BUILD_SHARED_LIBRARY)
#================================================
include $(CLEAR_VARS)
LOCAL_MODULE := libjni_photoeditor
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := libm liblog libjnigraphics
LOCAL_LDLIBS := -lm -llog -ljnigraphics -lbcc
LOCAL_LDLIBS := -lm -llog -ljnigraphics
LOCAL_SRC_FILES := _jni.cpp utils.cpp quantize.cpp #etc.. 24 files
LOCAL_CFLAGS := -Werror \
-I$(OUT)/../../../../frameworks/compile/libbcc/include
LOCAL_LDFLAGS := -L$(OUT)/system/lib
include $(BUILD_SHARED_LIBRARY)
Android.mk
:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
defaultConfig {
applicationId "xxxxxxxxxxxxxxxxxxxxx"
minSdkVersion 16
targetSdkVersion 16
versionCode 1
versionName "1.0"
ndk {
abiFilters 'armeabi-v7a' //,'x86'
}//ndk
}//defaultConfig
buildTypes {
release {
minifyEnabled true
proguardFiles.add(file('proguard-android-optimize.txt'))
proguardFiles.add(file('proguard-rules.pro'))
}//release
debug {
minifyEnabled false
jniDebuggable true
renderscriptDebuggable true
}//debug
}//buildTypes
externalNativeBuild {
// Encapsulates your CMake build configurations.
// cmake {
// // Provides a relative path to your CMake build script.
// path "src/main/cpp/CMakeLists.txt"
// }
ndkBuild {
//****this is the working build****
path 'src/main/cpp/Android.mk'
}//ndkBuild
}//externalNativeBuild
}//android
dependencies {
}//dependencies
APP_ABI := armeabi-v7a
APP_PLATFORM := android-19
APP_STL := stlport_static
#================================================
LOCAL_PATH := $(call my-dir) #only call it ONCE !
#================================================
include $(CLEAR_VARS)
LOCAL_MODULE := hello_world
LOCAL_MULTILIB := 32
LOCAL_SRC_FILES := hello_world.cpp
include $(BUILD_SHARED_LIBRARY)
#================================================
include $(CLEAR_VARS)
LOCAL_MODULE := libjni_photoeditor
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := libm liblog libjnigraphics
LOCAL_LDLIBS := -lm -llog -ljnigraphics -lbcc
LOCAL_LDLIBS := -lm -llog -ljnigraphics
LOCAL_SRC_FILES := _jni.cpp utils.cpp quantize.cpp #etc.. 24 files
LOCAL_CFLAGS := -Werror \
-I$(OUT)/../../../../frameworks/compile/libbcc/include
LOCAL_LDFLAGS := -L$(OUT)/system/lib
include $(BUILD_SHARED_LIBRARY)
测试1。安卓工作室Build->buildapk(s)
Build
(A)修改我的一个项目24C++
文件(quantize.cpp
)并重建
(B)构建->构建APK
(C)只有C:\Android\PhotoRend1\app\build\intermediates\ndkBuild\debug\obj\local\armeabi-v7a\objs debug\jni\u photoeditor\quantize.o时间戳更改(和库)
测试2<代码>渐变终端窗口(命令行)生成
从我在终端窗口中使用的项目根目录
到汇编
myapk
(1)每件东西都是最新版本:
C:\Android\PhotoRend1>gradlew assembleDebug
(2)修改我的一个项目24C++
文件(quantize.cpp)并重新组装
(3)一个文件更改为最新版本:
C:\Android\PhotoRend1>gradlew assembleDebug
一些链接:
我终于找到了问题的原因
我的项目中,我使用C++文件。 NDK无法立即应用在这些文件中所做的更改,并且 除非重建整个项目,否则不会在应用程序中表达
解决方案是使用硬拷贝文件。 如果我能找到一些正确使用符号链接文件的方法,那就更好了 为了我的需要。在此之前,我至少可以编辑单个或多个文件,而无需重新编译整个项目 这是一个相对深奥的情况,但可能有助于未来的某个人 您的项目或文件可能有问题。对Android Studio的了解还不够,无法确定。如果Windows上的这种错误行为只发生在Android Studio中,但命令行ndk build或cmake正确地执行了部分重新编译,则可以在终端窗口中运行本机生成(确保使用的路径和参数与以前完全相同)。您的
build.gradle
文件中是否有minifyEnabled true
属性?这可能是因为GLOB
?我的意思是,如果您明确列出源文件,这可能会得到解决。我认为你不需要${CPP\u SRC}
中的.h
和.hpp
文件,你的build.gradle
文件中有一个打字错误(libraryVariants.all
都有一个过多的曲尾括号)。我已经测试了两个ABIs
和ndkBuild
是否正确(请参阅更新的答案->结构)<代码>拆分正常。如图所示,它必须是您的CMakeLists.txt
。像我一样展示你的结构(它将在不同的地方)。我已经将我的gradle更新为4.4。我使用的是安卓3.1.2和NDK16。我必须为本机代码使用CMake构建。我已经用gradlew assembleerelease从cmd构建了这个项目,但问题仍然存在。你的解决方案可以用CMake测试吗?我已经添加了我的CMake和gradle文件。我还将努力研究你的最新答案