如何使用build.gradle文件将静态库添加到Android NDK?

3

我正在尝试学习如何在AndroidStudio中使用NDK,并希望导入“native-activity”示例中使用的“android_native_app_glue”文件,以便拥有基本功能框架,如显示、触摸等。在示例中,它使用以下代码在android.mk文件中加载库:

LOCAL_STATIC_LIBRARIES := android_native_app_glue

然后在“main.c”中只需简单地导入它:

#include <android_native_app_glue.h>

在Android Studio中,据我所知通过实验,它不使用android.mk文件,而是使用build.gradle文件来执行所有相同的功能。例如,要替换android.mk中的LOCAL_LDLIBS := ...,可以在build.gradle中使用ldLibs = ...。那么,什么gradle代码可以替换LOCAL_STATIC_LIBRARIES呢?
是否有一个资源可以解释如何从android.mk翻译到build.gradle?

嗨Sam,如果您想学习使用NDK,请查看我在此处发布的问题(https://dev59.com/HWQn5IYBdhLWcg3wpomp#27737154)中的答案和我的相关博客文章(http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/)。 - SJoshi
1个回答

2

如果您真的想在没有Makefiles的情况下使其工作,您可以将ndk\sources\android\native_app_glue\android_native_app_glue.(c|h)复制并粘贴到您的jni文件夹中,并将android添加到您的ldLibs

否则,您仍然可以依赖传统的Makefiles,通过停用对ndk-build的默认调用,并让gradle使用您在libs目录中的库:

sourceSets.main {
    jniLibs.srcDir 'src/main/libs'
    jni.srcDirs = [] //disable automatic ndk-build call
}

在这种情况下,您将不得不自己调用ndk-build,但您也可以让gradle为您调用它:
// call regular ndk-build(.cmd) script from app directory
task ndkBuild(type: Exec) {
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath
    } else {
        commandLine 'ndk-build', '-C', file('src/main').absolutePath
    }
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
}

我不确定这个程序的哪些部分放在哪里。因此,我会添加“lbLibs=“Android””,那么我应该把“ndk/sources/.../android_native_app_glue”放在哪里?对于其余的代码,它是否应该放在gradle文件中?我尝试将其添加到那里,但它显示“找不到方法:main()”。是不是“sourceSets.main”需要放在gradle文件的某个特定部分,例如在android{}中? - Sam Jaques
进一步探索后,我发现如果我加上 "#include <../../../../../sources/android/native_app_glue/android_native_app_glue.h>",那么它将编译本地的粘合代码,但如果我尝试调用任何函数(例如 "app_dummy()"),则会出现 "未定义的引用" 错误。我需要添加更多内容以确保它实际上可以使用在 android_native_app_glue.h 中声明的函数吗? - Sam Jaques
是的,您需要添加 ldLibs "android"。然后将 android_native_app_glue 中的 .c 和 .h 复制到您的 jni 源中。从您的代码中,像往常一样引用头文件 #include <android_native_app_glue.h>。sourceSets.main 放在 android {} 中,但只有在您想使用自己的 Makefiles 时才放置此代码。 - ph0b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接