第一步 :下载 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 __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
点击下面的加号就可以添加外部工具了
第一个:快速生成头文件工具
第一个:快速编译 so 库工具
之后你可以通过右键 java 文件 -> External Tools -> javah/ndk-build 来快速生成头文件/编译 so库啦
以上就是本文的全部内容了,希望可以帮助到像我一样刚接触 ndk 开发的你
Enjoy your coding life~