android - 使用 NDK 构建迁移到 Gradle Experimental 的问题

标签 android gradle android-ndk android-gradle-plugin

由于我决定将 native 代码添加到应用程序中,因此我在 this migration guide 之后转到 Gradle Experimental 插件。 .由于新的不同语法,我已经成功解决了许多兼容性问题,但我仍然有问题。

该应用程序本身可以工作,但是我应该能够通过此迁移归档两件丢失的东西:

  • 调试 native 代码文件
  • 使 NDK 构建过程自动化,替换 Android.mk 方法,因此在进行更改时重新编译所需的库

  • 调试

    对于第一点,我读到 Edit Configurations > Debugger > Debug type = Hybrid应该足够了,但我仍然无法执行 native 代码的调试。这个问题可能是由于我没有正确配置 gradle 造成的? (见下文)

    NDK 构建

    我正在尝试翻译 Android.mk 并将其放入 Gradle 构建文件但没有成功。运行应用程序时不会反射(reflect)对 native 文件的更改,因为尚未重建 native 库。我试图从 here 那里得到一些建议.

    我当前的 Android.mk
    LOCAL_PATH:= $(call my-dir)
    
    include $(CLEAR_VARS)
    
    MY_CHROMAPRINT_SRC_FILES := \
        ../deps/chromaprint/src/audio_processor.cpp \
        ../deps/chromaprint/src/base64.cpp \
        ../deps/chromaprint/src/chroma.cpp \
        ../deps/chromaprint/src/chroma_filter.cpp \
        ../deps/chromaprint/src/chromaprint.cpp \
        ../deps/chromaprint/src/chroma_resampler.cpp \
        ../deps/chromaprint/src/fft.cpp \
        ../deps/chromaprint/src/fft_lib_kissfft.cpp \
        ../deps/chromaprint/src/filter.cpp \
        ../deps/chromaprint/src/fingerprint_calculator.cpp \
        ../deps/chromaprint/src/fingerprint_compressor.cpp \
        ../deps/chromaprint/src/fingerprint_decompressor.cpp \
        ../deps/chromaprint/src/fingerprinter_configuration.cpp \
        ../deps/chromaprint/src/fingerprinter.cpp \
        ../deps/chromaprint/src/image_builder.cpp \
        ../deps/chromaprint/src/integral_image.cpp \
        ../deps/chromaprint/src/silence_remover.cpp \
        ../deps/chromaprint/src/spectral_centroid.cpp \
        ../deps/chromaprint/src/spectrum.cpp \
        ../deps/chromaprint/src/avresample/resample2.c
    
    MY_KISSFFT_SRC_FILES := \
        ../deps/kissfft/kiss_fft.c \
        ../deps/kissfft/tools/kiss_fftr.c
    
    LOCAL_MODULE := my_app_lib
    LOCAL_SRC_FILES := my_app_lib.c $(MY_CHROMAPRINT_SRC_FILES) $(MY_KISSFFT_SRC_FILES)
    LOCAL_CFLAGS := -DWITH_KISSFFT -DHAVE_ROUND
    LOCAL_LDLIBS := -llog
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/../deps/chromaprint/src $(LOCAL_PATH)/../deps/kissfft
    
    include $(BUILD_SHARED_LIBRARY)
    

    截至目前的 build.gradle 文件:
    apply plugin: 'com.android.model.application'
    
    def ndkDir = System.getenv("ANDROID_NDK_HOME")
    def propertiesFile = project.rootProject.file('local.properties')
    if (propertiesFile.exists()) {
        Properties properties = new Properties()
        properties.load(propertiesFile.newDataInputStream())
        ndkDir = properties.getProperty('ndk.dir')
    }
    
    model {
        android {
    
            compileSdkVersion 25
            buildToolsVersion "25.0.2"
    
            ndk {
                moduleName "my_app_lib"
                CFlags.add("-DWITH_KISSFFT -DHAVE_ROUND -DDEBUG_MODE=1")
                CFlags.add("-I${file("deps/chromaprint/src")}".toString())
                ldLibs.add("log")
                stl "stlport_static"
            }
    
            defaultConfig.with {
                applicationId "com.my_app"
                minSdkVersion.apiLevel 16
                targetSdkVersion.apiLevel 25
                versionCode 132
                versionName "1.6.108"
                vectorDrawables.useSupportLibrary = true
            }
    
            buildTypes {
    
                release {
                    debuggable = false
                    minifyEnabled = true
                    proguardFiles.add(file("proguard-rules.pro"))
                    ndk.with {
                        debuggable = true
                    }
                }
                debug {
                    debuggable = true
                    minifyEnabled = false
                    proguardFiles.add(file("proguard-rules.pro"))
                    ndk.with {
                        debuggable = true
                    }
                }
            }
    
            sources {
                main {
                    java {
                        source {
                            srcDir "src"
                        }
                    }
                    jni {
                        source {
                            srcDirs = [ "jni" ]
                        }
                    }
                    jniLibs {
                        source {
                            srcDirs = [ "libs" ]
                        }
                    }
                }
            }
    
            externalNativeBuild {
                ndkBuild {
                    path 'jni/Android.mk'
                }
            }
        }
    }
    
    task buildNative(type: Exec, description: 'Compile JNI source via NDK'){
        commandLine "$ndkDir\\ndk-build.cmd",'-C', file('jni').absolutePath
    }
    
    tasks.all {
        task ->
            if (task.name.startsWith('compile') && task.name.contains('MainC')) {
                task.enabled = false
            }
            if (task.name.startsWith('link')) {
                task.enabled = false
            }
            if (task.name.endsWith('SharedLibrary') ) {
                task.dependsOn buildNative
            }
    }
    

    这是当前的文件夹结构:

    enter image description here

    我很确定 Gradle NDK 部分缺少一些东西,但我应该解决这个问题吗?如果这会导致一个愚蠢的问题,我很抱歉,但这是我第一次进入 NDK 和 mk 逻辑。

    编辑:我发现反馈报告了相同的问题,无法使用最新的 NDK/AS 调试 native 代码,所以我们必须等待......

    最佳答案

    当我更新到 Android Studio 2.3.3 并将项目 Gradle 插件更新到 2.3.3 时,问题得到了解决。

    同样在 Android Studio 3.0 上它仍然很好。

    关于android - 使用 NDK 构建迁移到 Gradle Experimental 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41765667/

    相关文章:

    android - --target native-lib 不是一个目录

    调试 ARM 程序集(Neon 扩展)

    java - 如何从 META-INF 目录加载属性文件?

    使用 AndroidStudio 调试时,Android SDK 调试信息错误?

    android shell 已被授予 super 用户权限

    android - queryBuilder.appendWhere() 的意义何在?安卓

    Gradle 对非 Java 构建的依赖项的使用

    Android NDK seekg 坏了?

    android - Android QMediaPlayer 可以播放哪些视频文件?

    android - java.lang.ClassNotFoundException : android. view.View$OnUnhandledKeyEventListener