NDK编译环境搭建以及牛刀小试

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,然后直接运行就行了,你就会发现项目能够直接运行了。如果有后续问题,可以留言咨询。

猜你喜欢

转载自blog.csdn.net/qq_35920289/article/details/78501313
今日推荐