首先将以前写的搬出来方便看
AS下编辑native—较新方法-使用cmake(常用!)
AS可以先写好java类,然后点击错误修正可以自动生成对应c文件与原生函数头。
AS生成的:注意as下如果是cpp文件extern “C” 必加
当你使用错误修正时是生成c版本的时自动不加,当是cpp文件中错误修正时自动加
AS所有配置文件基础目录都是当前同一目录下
例如AndroidManifest.xml中指明了java代码路径
build.gradle中的文件cmakelist从当前下找
创建项目
创建支持原生代码的项目与创建任何其他 Android Studio 项目类似,不过前者还需要额外几个步骤:
- 在向导的 Configure your new project 部分,选中 Include C++ Support 复选框。点击 Next。
- 正常填写所有其他字段并完成向导接下来的几个部分。
- 在向导的 Customize C++ Support 部分,您可以使用下列选项自定义项目:
C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。
Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。
点击 Finish。
目录
- 在 cpp 组中,您可以找到属于项目的所有原生源文件、标头和预构建库。对于新项目,Android Studio 会创建一个示例 C++ 源文件 native-lib.cpp,并将其置于应用模块的 src/main/cpp/ 目录中。本示例代码提供了一个简单的 C++ 函数 stringFromJNI(),此函数可以返回字符串“Hello from C++”。
- 在 External Build Files 组中,您可以找到 CMake 或 ndk-build 的构建脚本。与 build.gradle 文件指示 Gradle 如何构建应用一样,CMake 和 ndk-build 需要一个构建脚本来了解如何构建您的原生库。对于新项目,Android Studio 会创建一个 CMake 构建脚本 CMakeLists.txt,并将其置于模块的根目录中。且必须叫这个名字。
- cmake与ndk-build的配置都在build.gradle的管理配置下。123456使用cmake构建,指定文件externalNativeBuild {cmake {path "CMakeLists.txt"}}
运行过程
- Gradle 调用您的外部构建脚本 CMakeLists.txt。
- CMake 按照构建脚本中的命令将 C++ 源文件 native-lib.cpp 编译到共享的对象库中,并命名为 libnative-lib.so,Gradle 随后会将其打包到 APK 中。
- 运行时,应用的 MainActivity 会使用 System.loadLibrary() 加载原生库。现在,应用可以使用库的原生函数 stringFromJNI()。
- MainActivity.onCreate() 调用 stringFromJNI(),这将返回“Hello from C++”并使用这些文字更新 TextView。
CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
CMake最小版本使用的是3.4.1。
add_library()
这个就是往项目中添加要生成的东西 即使是第三方库生成或使用也要先生成目标文件,这里决定最后lib中有什么
配置so库信息(为当前当前脚本文件添加库)
参一:这个是声明引用so库的名称,在项目中,如果需要使用这个so文件,引用的名称就是这个。生成的会加前后缀
参二:
STATIC:静态库,是目标文件的归档文件,在链接其它目标的时候使用。
SHARED:动态库,会被动态链接,在运行时被加载。
MODULE:模块库,是不会被链接到其它目标中的插件,但是可能会在运行时使用dlopen-系列的函数动态链接。
参三:构建so库的源文件路径,注意是相对cmakelist的。
还可以用来构建有源代码的库
还可以用来构建使用已有so的库,set_target_properties用于设置查找so库的路径
include_directories
配置头文件路径,注意这里指定的是目录而非文件
find_library()
这个就是用来使用android上提供的
这个方法与我们要创建的so库无关而是使用NDK的Apis或者库,默认情况下Android平台集成了很多NDK库文件,所以这些文件是没有必要打包到apk里面去的。直接声明想要使用的库名称即可
参一:出口,存放库的路径
参二:指定使用的库
target_link_libraries()
这个就是一个连接操作,将后面的连接到第一个文件中
如果你本地的库(native-lib)想要调用log库的方法,那么就需要配置这个属性,意思是把NDK库关联到本地库。
参一:要被关联的库名称
其它参:要关联的库名称。${log-lib}为取找到的路径
完整示例
|
|