NDK编译环境搭建
NDK全称Native Development Kit,要想开发NDK,首先需要下载NDK包。这里提供两种方式获取NDK开发包:
第一种:链接:http://pan.baidu.com/s/1gfgsBOf 密码:ngd5
第二种:直接通过AndroidStudio下载,推荐使用这种。
第一步 :File->setting
第二步:配置环境变量
配置了这么多次环境变量,应该不用知道了把,这里只说一下,应该拷贝什么路径到环境变量中:
1、如果是第一种方式获取的NDK开发包,那么你需要把压缩包解压到你觉得合适的路径下就行(文件目录名最好不要带有空格或者中文),直接把 E:\android-ndk-r14b 添加到环境变量中。
2、如果是第二种D:\Android\sdk\ndk-bundle
说白了就是找到NDK的当前路径,然后添加到环境变量中就行
第三步:测试是否安装配置成功
如上图所示,直接在输入 ndk-build(ndk 和 -build 之间没有空格) 指令即可,如果出现如图所示的结果,就证明你已经配置成功。
第四步:配置AndroidStudio编译环境
1.当然你首先得创建一个项目,然后打开工程目录下的local.properties,你会发现里面有一个
sdk.dir = D:\Android\sdk 也就是你的SDK路径。同理你需要在这添加你的NDK路径
ndk.dir=D:\Android\sdk\ndk-bundle 注意路径’\’的转义用双斜线。
当然你也可以用一种一劳永逸的方法,直接像配置SDK路径一样,配置一下NDK路径就行。
File -> Project Structure
在Android NDK location: 下面直接选择你NDK所在路径即可。
2.gradle.properties文件中需要添加一行代码:android.useDeprecatedNdk=true // 兼容老版本
3.在module下的build.gradle目录下同样需要添加代码进行配置:
defaultConfig{
ndk{
moduleName = "Hello"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
}
4.编写Java源码(创建jni目录–在main目录下)
a.MainActivity.java
b.JNI.java
JNI.java代码:
public class JNI {
//静态代码块最先加载 (代码中所有的中文注释不要留在代码中,此处只是方便大家理解,如果有中文,在编译头文件时,可能不会成功)
static{ //加载libHello.so
System.loadLibrary("Hello"); //生成的$lib.so的前缀
}
// native方法
public native String sayHello();
}
MainActivity.java代码
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.text_string);
textView.setText(new JNI().sayHello());
}
}
5.生成JNI头文件(编译带有native方法的文件)
通过Terminal命令控制窗口编译
cd //进入目录的命令
cd.. //退出当前目录的命令
-d <输出路径>
完整的命令
javah -d ../jni -jni com.test.hui.ndkdemo.JNI
当然,你也可以直接输入
javah -jni com.test.hui.ndkdemo.JNI
然后将头文件剪切到jni目录下
其中上面一条命令中绿色部分,只是将编译得到的头文件放到指定目录下。
6.开始准备相关的C文件
生成的头文件中含有以下这样一段代码,这是头文件中的方法声明,所以我们需要在创建一个.cpp文件,实现该方法的定义(也就是实现该方法)。
Java_com_test_hudezhi_ndkdemo_JNI_sayHello该方法名可以直接通过拷贝native方法名(选中方法名,右键copy reference,然后粘贴到头文件中,将 ‘.’ 改成‘下划线’,然后再前面加上 Java_ 说明是Java中的方法)
JNIEXPORT jstring JNICALL Java_com_test_hudezhi_ndkdemo_JNI_sayHello
(JNIEnv *, jobject);
其中 JNIEXPORT 以及 JNICALL 可以去掉,并不影响结果。在jni目录下新建Hello.cpp文件
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
#include "com_test_hudezhi_ndkdemo_JNI.h" //头文件名
//将头文件中的方法声明拷贝过来,去掉分号,加上方法体(方法的具体实现代码)
//JNIEnv* env 是JNI环境变量
jstring Java_com_test_hudezhi_ndkdemo_JNI_sayHello(JNIEnv* env,jobject jobj){
char* text = "I am form C";
return (*env)->NewStringUTF(env,text); // NewStringUTF()方法可以直接调用(见文知义)。
}
OK,到此处,该写的代码都写完了,然后rebuild project,然后直接运行就行了,你就会发现项目能够直接运行了。如果有后续问题,可以留言咨询。