【问题标题】:Android: Linking a external static C/C++ Library in Android StudioAndroid:在 Android Studio 中链接外部静态 C/C++ 库
【发布时间】:2019-01-28 15:32:08
【问题描述】:

我已经看到了很多使用 Cmake 让 Native Code 在 Android Studio 中工作的答案,但是关于如何将预编译的 C/C++ 库包含到 Android 中的答案并不多。以下是我为尝试让原生库(首先尝试使用 .a)工作而采取的步骤。

1) mylib.c 是我要导入 Android Studio 的 C 库

#include "mylib.h"


    int total_foo;

    int foo(float y, float z) { 
    total_foo = y + z;
    return total_foo;

    }

2) mylib.h 是 mylib.c 的头文件

#ifndef _MYLIB_H_
#define _MYLIB_H_

    #define MAX_FOO  20

        struct foo_struct {  
        int x;
        float y;
    };
    typedef struct foo_struct foo_struct;

    extern int total_foo;   

    extern int foo(float y, float z); 

#endif

3) .o 文件的命令(使用带有 make_standalone_toolchain.py 的 NDK)

$CC -o mylib.o -c mylib.c 

4) .a 文件的命令

ar rcs mylib.a mylib.o

5) 创建原生 C++ 项目

现在这就是我卡住的地方。我已经创建了具有 Native C++ 支持的 Android Studio 项目,并且需要弄清楚将我的预编译 mylib.a 文件放在哪里才能使函数调用“foo”。我看到了所有不同类型的地方,比如 jniLibs 文件夹、 libs 和 cpp 文件夹。但是没有关于之后做什么的例子。就像将 Native Library 添加到 Gradle 中一样。

*将代码放入 Android Studio 并使用 Cmake 已结束,因为我将只有一个静态库文件。 *

TLDR:如何将预编译的 *.a 文件添加到 Android Studio。

【问题讨论】:

  • 预建库仍应使用 NDK 构建,而不是使用主机的 GCC 或其他工具链。
  • @Michael 好的,谢谢你的提示。完成后我将使用 NDK 重新编译库,您将如何链接它?

标签: android c++ c android-studio native


【解决方案1】:

假设您在某处有一个使用 NDK 构建的 mylib.a,您可以在主共享库中链接它,如下所示:

CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)

add_library(native-main-lib SHARED src/main/cpp/native-lib.cpp)

add_library(my_lib STATIC IMPORTED)
set_target_properties(my_lib PROPERTIES IMPORTED_LOCATION path/to/mylib.a)
set_target_properties(my_lib PROPERTIES INCLUDE_DIRECTORIES path/to/mylib/include)

target_link_libraries(native-main-lib my_lib)

【讨论】:

  • 感谢您的回复。我正在下载 NDK-build 但最后一个问题。我是否需要对 Gradle/Application 做任何其他事情,或者我可以使用 static { System.loadLibrary("my_lib"); 调用它吗? }
  • 虽然在 Java SE 8 中添加了从 Java 加载静态本机库的支持,但我不确定 Android 是否支持。如果您有一些要使用的静态库,您通常在 Android 上做的是构建一个共享库,该库链接到静态库并提供 JNI 包装器以调用静态库中的函数,然后从Java。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
相关资源
最近更新 更多