Android---NDK开发随手笔记

来源:互联网 发布:在淘宝上买气排安全不 编辑:程序博客网 时间:2024/05/21 15:40

Android新手,也是用Android studio没多久,来公司实习需要用到JNI的知识,就顺便学了下NDK了,首先介绍一下在studio中安装使用NDK

使用jni有的是使用ndk-build方式,生成头文件,然后自己建立Android.mk文件,但是在AS中我们可以更简单,使用cmake。

一、下载cmake(外部构建工具)、ndk和LLDB(调试C、C++代码使用)

打开AS的sdkManager界面,勾选这三种工具,安装。



二、新建Android项目,跟普通建立项目是一样的,不过在填写名字那里,勾选 Include C++ Support 然后就跟普通的app一样,最后会有一个C++向导页面,这里解释下这几个是什么意思,我是初学者,这是网上看的,整理进来给大家,我使用的是默认的,直接finish。

  • 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。

三、到这里大家应该可以看到我们的项目里边多了一些内容,多了一个cpp文件夹,和一个cmake的目录:

还有gradle里边的一些依赖已经自动创建好了,我们自己不用操心。





自己先理解一下,cpp就是我们写的C++的文件,头文件等等之类的都放在这里。CmakeLists.txt是一个cmake构建的配置文件,我们写的C++文件都要在这里进行配置,cmake才会帮我们自动编译供Java使用。以下是详细解释:


1、cpp 中,您可以找到属于项目的所有原生源文件、标头和预构建库。对于新项目,Android Studio 会创建一个示例 C++ 源文件 native-lib.cpp,并将其置于应用模块的 src/main/cpp/ 目录中。本示例代码提供了一个简单的 C++ 函数 stringFromJNI(),此函数可以返回字符串“Hello from C++”。


2、External Build Files 中,您可以找到 CMake 或 ndk-build 的构建脚本。与 build.gradle 文件指示 Gradle 如何构建应用一样,CMake 和 ndk-build 需要一个构建脚本来了解如何构建您的原生库。对于新项目,Android Studio 会创建一个 CMake 构建脚本 CMakeLists.txt,并将其置于模块的根目录中。


三、就是开始使用ndk了,我首次接触ndk好多也不懂,慢慢一步一步来吧,现在就是分析下,首先我们在C++文件中定义一个方法,然后在Java中声明这个方法,并且加载一个库,这个库就是C++编译而来的。我们可以参考它的默认一个native-lib.cpp.理解这个流程。

下边我们自己写一个cpp文件,命名为hello.cpp,内容很简单:


如果我们需要在新加一些方法的话,每个方法都要在方法上步加一句:

extern "C" 意思是继承C语言的编码规范之类的

#include <jni.h>#include <string>extern "C"JNIEXPORT jstring JNICALLJava_com_yujie_italker_demo_MainActivity_helloFromJNI(JNIEnv *env, jobject obj){    return env -> NewStringUTF("nihao jim");}


然后我们在CMakeLists.txt中配置:也就是将native-lib改为我们自己写的就好,第一个小例子先这样偷懒做一下。

cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.             hello             # Sets the library as a shared library.             SHARED             # Provides a relative path to your source file(s).             src/main/cpp/hello.cpp )
find_library( # Sets the name of the path variable.              log-lib              # Specifies the name of the NDK library that              # you want CMake to locate.              log )

target_link_libraries( # Specifies the target library.                       hello                       # Links the target library to the log library                       # included in the NDK.                       ${log-lib} )
然后就是在MainActivity.java里调用我们写的方法了:



然后我就有疑问了,到这里之后cmake怎么用呢,怎么编译,构建什么的呢?毕竟新手。后来发现AS你只要点击run就会帮你自动做这些工作的,接下来直接将程序运行到模拟器,看结果!



大神不要嘲笑新手,写点东西让自己能以后看看,写的不好请