使用NDK构建迁移到Gradle实验的麻烦

时间:2017-01-20 14:14:32

标签: android gradle android-ndk android-gradle

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

应用程序本身可以运行,但我应该能够通过此迁移归档两个缺失的内容:

  • 调试本机代码文件
  • 自动创建NDK构建过程,替换Android.mk方法,以便在进行更改时重新编译所需的库

调试

关于第一点我读到去Edit Configurations > Debugger > Debug type = Hybrid应该就够了,但我仍然无法执行本机代码的调试。这个问题可能是因为我没有正确配置gradle这个事实? (见下文)

NDK-构建

我正在尝试翻译Android.mk并将其放入Gradle构建文件中但没有成功。运行应用程序时不会反映对本机文件的更改,因为尚未重建本机库。我试图从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调试本机代码,所以我们必须等待......

1 个答案:

答案 0 :(得分:0)

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

同样在Android Studio 3.0上,它还可以。