Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:链接外部静态C/C++;Android Studio中的库_Android_C++_C_Android Studio_Native - Fatal编程技术网

Android:链接外部静态C/C++;Android Studio中的库

Android:链接外部静态C/C++;Android Studio中的库,android,c++,c,android-studio,native,Android,C++,C,Android Studio,Native,我已经看到了很多关于如何在Android Studio中使用Cmake来实现本地代码的答案,但是关于如何在Android中包含预编译的C/C++库的答案并不多。以下是我尝试使用本机库(首先尝试使用.a)的步骤 1)mylib.c是我想要导入Android Studio的c库 #include "mylib.h" int total_foo; int foo(float y, float z) { total_foo = y + z; return tota

我已经看到了很多关于如何在Android Studio中使用Cmake来实现本地代码的答案,但是关于如何在Android中包含预编译的C/C++库的答案并不多。以下是我尝试使用本机库(首先尝试使用.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文件的命令(使用NDK和make_standalone_toolchain.py)

4)用于.a文件的命令

ar rcs mylib.a mylib.o
< P> <强> 5)创建本机C++项目>/P> 这就是我被困的地方。我用原生C++支持创建了Android Studio项目,需要找出我的预编译MyLIB的位置。一个文件能够使函数调用“Foo”。我看到了所有不同类型的地方,比如jniLibs文件夹、libs和cpp文件夹。但是,没有例子说明之后该做什么。就像将本机库添加到Gradle中一样

*将代码放入androidstudio并使用Cmake是不可能的,因为我只有一个静态库文件*


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

假设您有一个使用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构建,而不是使用主机的GCC或其他工具链。@Michael好的,谢谢你的提示。一旦完成,我将用NDK重新编译库。你将如何链接它?谢谢你的回复。我正在下载NDK版本,但还有最后一个问题。我是否需要对Gradle/应用程序执行任何其他操作,或者我是否能够使用static{System.loadLibrary(“my_lib”)}调用它虽然JavaSE8中添加了对从Java加载静态本机库的支持,但我不确定Android是否支持这一点。如果您想要使用某个静态库,那么在Android上通常要做的是构建一个共享库,该库链接到静态库,并提供JNI包装器来调用静态库中的函数,然后从Java加载共享库。
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)