第一步 :下载 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 /* Header for class com_virtualightning_testproject_csdn_MainActivity */#ifndef _Included_com_virtualightning_testproject_csdn_MainActivity#define _Included_com_virtualightning_testproject_csdn_MainActivity#ifdef __cplusplusextern "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.soLOCAL_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

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


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





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



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


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


Enjoy your coding life~

更多相关文章

  1. 如何让android apk 获得系统权限
  2. Ubuntu下搭建Android(安卓)NDK开发环境
  3. android 实用代码片段整理
  4. Android(安卓)Framework系统服务详解
  5. Qt5.8开发Android:强制横屏
  6. android编译步骤
  7. 为Android内核添加hello world驱动并添加到menuconfig菜单
  8. Android培训班(48)
  9. Android手动编译打包

随机推荐

  1. CSS之伪类选择器和简单盒子简单案例
  2. Android中不规则形状View的布局实现
  3. [随便写写]Android基础教程
  4. Android开发之旅:应用程序基础及组件
  5. Android(安卓)adb环境配置
  6. android handler总结
  7. Android统计图表MPAndroidChart:为多条统
  8. andorid handler 消息传递机制
  9. 如何使用Mindjet Maps for Android中的移
  10. Google Cloud Messaging (Android(安卓)