如何预防C++;要在Android NDK中重新编译所有文件?

如何预防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++项目, 然后运行项目,从而对所有文件进行完整、冗余的编译 我正在寻找一种方法,让编译器只刷新已更改的文件,从而缩短构建过程。 注意:

你好,

<>我在一个有大量C++文件的项目中使用了带有NDK和JNI的Android工作室。当我在单个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'

}
提前感谢

简介 我认为这是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)修改我的一个项目24
C++
文件(
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<代码>渐变终端窗口(命令行)生成 从我在
终端窗口中使用的项目根目录
汇编
my
apk

(1)每件东西都是最新版本:

C:\Android\PhotoRend1>gradlew assembleDebug

(2)修改我的一个项目24
C++
文件(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文件。我还将努力研究你的最新答案