Android NDK开发之环境搭配

废话不多说,直接进入正题。本篇以Android Studio为例。

要用到NDK开发,那第一步肯定是下载NDK

一:下载NDK

选中CMake,LLDB和NDK,然后点击Apply,进行安装。有的同学可能会问为什么要选中CMake和LLDB,这是因为Android Studio从2.2版本开始支持CMake,在3.0以后已经强制使用CMake就行构建NDK了,在后面会有详细的讲解,稍安勿躁。

二:设置NDK环境变量

好了,到此我们改准备的东西就算全了,我们验证一下NDK环境是否配置好了,打开命令行,输入ndk-build

出现上图所示信息就表明配置成功,如果配置不成功请检查,环境配置是否有拼写错误或者NDK的地址是否正确,再不行,可以将Path中%NDK_ROOT%的位置调整到"."之下。

三:Android Studio中如何配置

1:新建一个Android项目

2:右键项目,选择Module Setting,检查Android NDK location的配置是否正确,一般来说,默认的应该是正确的,如果不正确,请指定到你自己的NDK目录。和NDK环境变量配置的一样。修改后点击“Ok”。

或者直接在local.properties中指定也可,添加下面代码即可:

ndk.dir=C\:\\Workspace\\SDK\\ndk-bundle

3:new JNI的接口类

然后添加一个简单的方法声明:

public class JniKit {
    public native String stringFromJni();
}

4:下来实现C的部分提供底层实现。

4.1 生成 .h

可以通过javah生成,在命令行下或者AS自带的terminal窗口下进行。

第一步:cd到JniKit所在包的根目录,本例即为:java目录。

第二步:输入:javah -jni(也可以不写) 包名+类名, javah -jni com.bzhao.ndktest.JniKit  ,在目录下会出现com_bzhao_ndktest_JniKit.h的头文件。

第三步:在main目录下创建jni目录,

第四步:拷贝第二步生成的.h文件到第三部生成的jni目录下,然后生成.cpp或者.c的源文件,本篇以.c为例。

点击“OK”。

第五部:编辑JniTest.c

#include "com_bzhao_ndktest_JniKit.h"

JNIEXPORT jstring JNICALL Java_com_bzhao_ndktest_JniKit_stringFromJni
  (JNIEnv *env, jclass cls) {
    return (*env)->NewStringUTF(env,"Hello, JNI");
  }

第六部:在要使用JNI的module下面手动添加CMakeLists.txt,进行配置,AS编译NDK时会用到该文件, 当然如果创建项目的时候已经选择了include C++ support时,这个时候,CMakeLists.txt已经就创建好了,可以忽略此步骤。

在CMakeLists.txt中添加下面代码,如果有多个C或CPP源码,就写多个add_library,其中第一个参数是lib的名字;第二个设置lib为SHARED, 第三个为源码
add_library( # Specifies the name of the library.
             JniTest

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/jni/JniTest.c )

关联CMakeLists

点击“OK” 或直接在app的build.gradle里进行配置,将下面代码拷贝纸android模块内。

externalNativeBuild {
    cmake {
        path 'CMakeLists.txt' //CMakeLists.txt的路径
    }
}

build一下,检查build出来的apk中是否已经生成响应的so。

次是默认是生成了对所有CPU的架构的支持,但是有时我们不需要这么多,那就需要在build.gradle中指定需要支持那些cpu架构,方式如下,添加如下代码在app的build.gradle。

ndk {
    abiFilters "armeabi-v7a", "x86 //添加需要支持的cpu架构
}

然后重新build,就只会在指定的架构下生成对应的so,以减少apk包的大小

第七部: 对so的使用

在需要引用的的地方加入,本例实在JniKit的工具类里使用。

static {
    System.loadLibrary("JniTest");
}

然后在其它地方进行应用(验证),本例是用kotlin写的,所以对于有些同学来说有点奇怪,不过重点不在这。

build->run,

第一篇就到此结束了,大家可以自己动手试试。

备注:由于本例没有在新建的时候直接添加C++ 的支持,所以有很多需要手动配置的地方,不过相信大家大部分也是这种情况,如果是新项目,建议大家在创建项目的时候直接就选择C++的支持,这样就省了很多手动配置的地方。

如果有写的不好的地方欢迎大家指正。

猜你喜欢

转载自blog.csdn.net/xiantongyuan/article/details/81974874