由于我决定将 native 代码添加到应用程序中,因此我在 this migration guide 之后转到 Gradle Experimental 插件。 .由于新的不同语法,我已经成功解决了许多兼容性问题,但我仍然有问题。
该应用程序本身可以工作,但是我应该能够通过此迁移归档两件丢失的东西:
调试
对于第一点,我读到
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
}
}
这是当前的文件夹结构:
我很确定 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/