编译使用Android NDK使用外部库的C / C ++项目

时间:2013-06-05 19:53:54

标签: android android-ndk cross-compiling

我是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如何使用这些?或者现在呢?

1 个答案:

答案 0 :(得分:0)

当我们在项目的顶层目录(图片中jni目录的父目录)中运行ndk-build时,我们基本上运行gnu make include {{1 }}

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

jni/Android.mk

文件是include $(call all-subdir-makefiles) ,它指的是其他人制作的二进制文件,例如

jni/myproject/Android.mk

等等。请注意,名称不是库文件的名称,而是构建它们的LOCAL_SHARED_LIBRARIES += openssl 的名称。

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


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

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