Android:链接外部静态C/C++;Android Studio中的库
我已经看到了很多关于如何在Android Studio中使用Cmake来实现本地代码的答案,但是关于如何在Android中包含预编译的C/C++库的答案并不多。以下是我尝试使用本机库(首先尝试使用.a)的步骤 1)mylib.c是我想要导入Android Studio的c库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
#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)