第一步 :下载 NDK

下载链接 :http://wear.techbrood.com/tools/sdk/ndk/index.html


第二步 :配置 NDK

打开你的 AS 项目

File -> Project Structure -> SDK Location

输入你下载好、解压之后的 NDK 路径

打开build.gradle(Module)

在 android 内输入



sourceSets {
    main {
        jni.srcDirs = []; //此行代码用于屏蔽掉 AS 自动帮你编译 so 库文件,如果你需要使用 mk 文件手动编译 so 库
        //jni.srcDirs = ['放置c/c++源文件的路径,一般为 src/main/jni ,之后你需要在指定路径创建对应文件夹']; 一般在编译时使用此行, Build Project时使用上面那行
        jniLibs.srcDirs = ['通过ndk生成的 so 动态库文件路径,一般为 src/main/libs ,同样需要在指定路径创建对应文件夹'];
    }
}



之后同步Gradle(Sync)

如果 Android-Android studio 出现 Error: NDK integration is deprecated in the current plugin

则在 gradle.properties 文件内输入

android.useDeprecatedNdk=true



允许使用过时的NDK版本


第三步 :编译一个简单的 so 库


这里我新建一个 Activity ,命名为 MainActivity


package com.virtualightning.testproject_csdn;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private native String getString();

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.v("NDK-TEST",getString());
    }
}



下一步使用 AS 自带的终端控制台输入指令:

javah -d app/src/main/jni -classpath app/src/main/java com.virtualightning.testproject_csdn.MainActivity

生成对应 jni  .h 头文件

javah 参数:

-d 指定生成头文件位置 

-classpath 指定类路径(我的java文件都在 app/src/main/java 文件夹下)

最后是类名(完整类名)


当然,你也可以 cd 到 app/src/main/java 下使用指令:

javah -d app/src/main/jni com.virtualightning.testproject_csdn.MainActivity,省去了指定类路径的操作


之后在 app/src/main/jni 下会生成一个文件 com_virtualightning_testproject_csdn_MainActivity.h


/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_virtualightning_testproject_csdn_MainActivity */

#ifndef _Included_com_virtualightning_testproject_csdn_MainActivity
#define _Included_com_virtualightning_testproject_csdn_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_virtualightning_testproject_csdn_MainActivity
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_virtualightning_testproject_1csdn_MainActivity_getString
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif



新建一个 cpp 文件(源文件),我命名为 test.cpp,用于定义头文件的函数


#include "com_virtualightning_testproject_csdn_MainActivity.h"


/*
 * Class:     com_virtualightning_testproject_csdn_MainActivity
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_virtualightning_testproject_1csdn_MainActivity_getString
        (JNIEnv * env, jobject obj)
{
    const char * str = "Hello Coder";

    return env->NewStringUTF(str);//通过 env 生成一个 jstring 对象,也就是 java 中 String 类对应的对象
}



因为我们是通过手动编译 so 库的,所以还需要 mk 文件,新建 Android.mk 和 Application.mk 文件

Android.mk



LOCAL_PATH := $(call my-dir) #指定路径 include $(CLEAR_VARS) #清理变量 LOCAL_MODULE := test # so 库名,生成之后的 so 库名为 libtest.so LOCAL_SRC_FILES +=test.cpp # 指定编译的源文件 include $(BUILD_SHARED_LIBRARY) # 指定生成的库为 so 库(动态分享库)



Application.mk



APP_ABI += x86\ armeabi\ armeabi-v7a\ mips #指定生成对应平台的 so 文件,这里我生成了 x86 , armeabi , armeabi-v7a , mips 平台的 so 文件



之后就可以执行编译指令:

ndk-build -C app/src/main/


ndk-build 参数 :

-C 指定 jni 文件夹所在的文件夹路径,我的 jni 文件夹的路径为 app/src/main/jni,所以在 AS 终端(当前目录为项目根目录)下,我指定的文件夹路径为 app/src/main


当然,你也可以 cd 到 app/src/main 下直接执行 ndk-build 指令


如果出现 ndk-build : command not found 问题,你需要配置 ndk 环境或者使用 alias(Linux) 来增加使用指令的效率


Linux 配置环境:

vim .bash_profile

打开后输入

export $PATH=$PATH:你的ndk根目录

完成之后 ESC + :wq 写入退出

然后执行

source .bash_profile 即可


以上就是配置 NDK 的全部步骤,下面推荐大家自己写两个 AS 外部工具,增加开发效率。

打开 Android Studio -> Perferences -> Tools -> External Tools

点击下面的加号就可以添加外部工具了


第一个:快速生成头文件工具


android ndk 对应 的版本 android ndk配置_java



第一个:快速编译 so 库工具

android ndk 对应 的版本 android ndk配置_android_02


之后你可以通过右键 java 文件 -> External Tools -> javah/ndk-build 来快速生成头文件/编译 so库啦


以上就是本文的全部内容了,希望可以帮助到像我一样刚接触 ndk 开发的你


Enjoy your coding life~