android ndk开发1

来源:互联网 发布:淘宝香港地址怎么填写 编辑:程序博客网 时间:2024/06/05 08:39

创建NDK项目

第一步 , 创建支持C++的项目


C++ support

其他的选项使用默认的即可 。

第二步 , 关联NDK

创建完成之后会报如下错误:


ndk r12b

在项目配置中 , 关联NDK之后就会ok


config ndk

第三步 , 编写native类及处理方法

在创建项目的时候 , 勾选了C++ support , 项目创建完成之后 , 会自动帮我们生成一个cpp/native-lib.cpp


auto create cpp file

你可以不用修改文件名 , 在新建native方法的时候 , 会提示你创建一个C++的JNI函数 , 直接创建就会生成一个JNI函数 , 都不用使用javah生成一个头文件 , 然后再引入头文件了 , 非常之方便 。


auto create jni function 1

创建函数:


auto create jni function 2

在这里 , 就不使用默认的.cpp文件了 , 我们新建一个.c文件 , 创建了HelloNDK.c文件之后 , Android Studio会提示我们 , 需要在Android.mk/CMakeLists.txt中进行声明 , 这里 , 我们使用默认的CMakeLists.txt建构工具 (创建项目的时候自动生成)。

第四步 , build.gradle配置:

externalNativeBuild {    cmake {            cppFlags ""            // 指定只用clang编译器            // Clang是一个C语言、Objective-C、C++语言的轻量级编译器。      arguments "-DANDROID_TOOLCHAIN=clang"            // 生成.so库的目标平台            abiFilters "armeabi-v7a" , "armeabi"        }}// 配置CMakeLists.txt路径externalNativeBuild {    cmake {              path "CMakeLists.txt"      }}

第五步 , 修改CMakeLists.txt

add_library( # Sets the name of the library.             HelloNDK  # 生成的.so库文件名称             # Sets the library as a shared library.             SHARED             # Provides a relative path to your source file(s).             # Associated headers in the same location as their source             # file are automatically included.             # 需要生成的.so库的文件路径             src/main/cpp/HelloNDK.c )target_link_libraries( # Specifies the target library.                       # 项目链接的.so库名称                       HelloNDK                       # Links the target library to the log library                       # included in the NDK.                       ${log-lib} )

第六步 , 编写native方法,以及C函数

/** * Created by Zeno on 2016/9/10. * * NDK Demo */public class HelloNDK {    public static native String sayHelloNDK() ;    static {        System.loadLibrary("HelloNDK");    }}
#include <jni.h>JNIEXPORT jstring JNICALLJava_com_zeno_encryptanddecrypt_ndk_HelloNDK_sayHelloNDK(JNIEnv *env, jclass thiz) {        // TODO         return (*env)->NewStringUTF(env, "this String come from C ");}

native方法的编写以及C函数的写法, 我们都非常熟悉了 , 这里就不再解释各自的意义了 。

第七步 , 编译


make

编译完成之后 ,我们可以切换到project视图,来查看.so文件


make success

第八步 , 运行


run

如果使用的是genymotion模拟器 , 这需要在abiFilters加入x86 ,不然项目会运行不起来的 。 当然, 也可以使用一个genymotion的arm插件 , 这样不配置x86也可以运行 。

// 生成.so库的目标平台abiFilters "armeabi-v7a" , "armeabi" , "x86"
声明:需要切换到project视图下,然后按照build --> intermediates --> cmake --> debug --> obj来找so库。
好多工程师就是找不到,再次声明。