【问题标题】:Compiling a C/C++ project that uses external libraries using the Android NDK使用 Android NDK 编译使用外部库的 C/C++ 项目
【发布时间】:2013-06-05 19:53:53
【问题描述】:

我对 Java 和 Android 开发人员完全陌生,但我正在尝试将 C/C++ 项目移植到 Android 手机上,只是为了进行一些测试。这里有一些细节。该项目依赖于 Openssl、GMP 和 NTL 库。我下载了副本并将所有内容放在jni/ 文件夹中。所以现在文件夹结构如下所示:

    jni/
       Android.mk
       gmp/
           Android.mk
           ...
       ntl/
           Android.mk
           ...
       openssl/
           Android.mk
           ...
       myproject/
           Android.mk
           ...

每个包含 .cpp, c. 文件的子文件夹都有一个 Android.mk 文件。现在,我的问题是:从广义上讲,我应该如何构建 Android.mk 文件的内容?我能够按照在线说明编译 Openssl(我在其中生成了所有 .so 文件)。顶级 Android.mk 将如何使用这些?还是现在呢?

【问题讨论】:

    标签: android android-ndk cross-compiling


    【解决方案1】:

    当我们在您项目的顶层目录(您图片中 jni 目录的父目录)中运行 ndk-build 时,我们实质上是运行 gnu make 和 include jni/Android.mk。

    在您的情况下,此顶部 jni/Android.mk 应仅包含所有子 .mk 文件:

    include $(call all-subdir-makefiles)
    

    main文件是jni/myproject/Android.mk,指的是别人生成的二进制文件,比如

    LOCAL_SHARED_LIBRARIES += openssl
    

    等等。请注意,这些名称不是库文件的名称,而是构建它们的 LOCAL_MODULE 的名称。

    通常,使用静态库更容易。例如,您需要按照正确的依赖顺序从 Java 中加载所有共享库。


    main 在这里是一个非正式的词。我只想说,这是导致其兄弟姐妹工作的 make 文件,并按照预期的顺序进行。它这样做是因为它通过指定LOCAL_SHARD_LIBRARIES 和LOCAL_STATIC_LIBRARIES 来引用其他make 文件生成的二进制文件。

    重要的是要理解,仅将所有 make 文件包含在 jni/Android.mk 中以使它们都完成它们的工作并按照预期的顺序完成是不够的。我想强调的是,jni/Android.mk 文件是 service 文件,而不是 main,即使它位于目录层次结构的顶部。

    【讨论】:

    • 如何让 jni/myproject/Android.mk 成为主文件?另外,如何在 jni/Android.mk 中包含 .mk 文件?最后,当我运行 ndk-build 时应该调用哪个文件(即我应该在哪个目录中)?
    猜你喜欢
    • 1970-01-01
    • 2013-04-07
    • 2021-09-07
    • 2015-01-16
    • 2021-09-20
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2017-11-27
    相关资源
    最近更新 更多