如何防止C++重新编译Android NDK中的所有文件?

Ari*_*ann 8 java-native-interface android android-ndk android-studio

你好,

我在一个包含大量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)
Run Code Online (Sandbox Code Playgroud)

和我的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'

}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Ari*_*ann 0

最后我找到了问题的原因。

在我的项目中,我使用了符号链接C++ 文件。NDK 无法立即应用在这些文件中所做的更改,并且除非您重建整个项目,否则它们不会在您的应用程序中表达。

解决方案是使用硬拷贝文件。

如果我找到某种方法可以正确处理符号链接文件,那么它会更好地满足我的需求。在那之前,我至少可以编辑单个或多个文件,而无需重新编译整个项目。

这是一个相对深奥的情况,但可能对将来的人有帮助。