android - 如何使用 Android Studio + Gradle + NDK 构建外部 C++ 库?

标签 android c++ android-ndk android-gradle-plugin

我现在正在将 C++ 库移植到 Android。我已经完成了初步工作,并以 Application.mk/Android.mk 的方式构建了它。

即将推出的图书馆 Java 演示应用程序现在正在 Android Studio 中开发。我可以一起构建所有东西(演示 + 库)——感谢 StackOverflow 社区。

但是我无法在这些构建中进行本地调试。但是调试是必要的——库还不够稳定。纯控制台 GDB 调试现在需要太多时间,将来可能会花费更多时间。

所以我决定使用 Android Studio 和 Gradle 进行构建以使用集成调试器。

我有包含 NDK 和 Java(包装器)部分的专用库模块。 但是 C/C++ 源文件不在 jni/子目录下。它们位于另一个目录中。

因此我可以将 Gradle 配置为从该目录获取源代码。 我试过这样的:

apply plugin: 'com.android.model.library'

model {
android {
    compileSdkVersion = 23
    buildToolsVersion = "23.0.2"

    defaultConfig.with {
        minSdkVersion.apiLevel = 10
        targetSdkVersion.apiLevel = 23
        versionCode = 1
        versionName = "1.0"
    }

    ndk {
        moduleName = "inttalksdk"
        stl "gnustl_shared"
        cppFlags.add("-std=c++11")
        cppFlags.add("-fexceptions")
        ldLibs.addAll(['log'])
    }
}

android.sources {
    main.jni.source {
        srcDirs.add(["src"])
    }
}


android.buildTypes {
    release {
        minifyEnabled = false
        proguardFiles.add(file('proguard-android.txt'))
    }
}
}

但 AS 甚至无法同步项目。 错误信息是:

Gradle 'Android' project refresh failed
Error:Attempt to read a write only view of model of type 'java.lang.Object' given to rule 'android.sources { ... } @ inttalksdk/build.gradle line 24, column 5'

我真正的问题是:如何将这些外部 C/C++ 文件添加到 Gradle 构建中?

我使用最新的 AS 2.0 + 0.7.0 beta3 实验插件。

请帮忙。

最佳答案

问题出在 0.7.0-beta3 实验插件中。我恢复到 0.6.0 版本。 这个语法没问题:

    android.sources {
    main {
        jni {
            source {
                srcDir "${project.ext.inttalksdk}/src/Components/Util/"
            }
        }
    }

关于android - 如何使用 Android Studio + Gradle + NDK 构建外部 C++ 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36773014/

相关文章:

c++ - 如何将 float 转换为 int 保留位值

android - 如何在Android.mk的LOCAL_CFLAGS中动态获取当前编译目标文件名?

java - 如果高分大于 20,则无法选中复选框

java - 安卓 : Need help in implementing ACRA

android - 如何获得谁向服务发送了 Intent ?

android - 完成 Android 设置?

tcp - FFmpeg 运行时错误。返回输入/输出错误

android - 如何从 url 播放流式音频/视频?

c++ - 如何检索智能指针数组的大小? (例如 std::unique_ptr<int[]>)

c++ - 如何取消长时间运行的 QSqlQuery?