介绍。
第二步就是就是直接写代码了。哈哈,你没听错,是这样的,方便吧?至于下载下来的NDK怎么和AS工程关联,也就是一行配置的问题,后文有说明带你一步一步体验。
But,还是要有个but,Android Studio还不是个壮年,尤其在NDK开发中,所以本文只是工具性的演示,实质是教会大家NDK开发。
首先:下载NDK
下载地址:http://blog.csdn.net/silk2018/article/details/51418564
1、在AS中新建一个Project,然后再新建一个class为NdkJniUtils,在内部声明native方法(jni使用的定义,后面系列教程会细说)。
/** * Created by Administrator on 2017/1/12. */ @SuppressWarnings("ALL") public class NdkJniUtils { public native String getCLanguageString(); }2、在工程主文件Activity中写入如下代码调运JNI的东西显示在UI上。
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import Utils.NdkJniUtils;
public class MainActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
NdkJniUtils jni = new NdkJniUtils();
tv.setText(jni.getCLanguageString());
}
}
3、然后build project得到其中中间文件,我们关注的是.class文件。编译OK以后生成的class文件在AS工程的如下目录:
NDKApplication\app\build\intermediates\classes\debug
然后接下来的步骤就是根据生成的class文件,利用javah生成对应的 .h头文件。
点开AS的Terminal标签,默认进入到该项目的app文件夹下。我在windows平台下输入如下命令跳转到class中间文件生成路径:
D:\AndroidStudioProjects\MyApplication2\jnidemo\build\intermediates\classes\debug----------这是自己项目的目录
xxxxx\app> cd build\intermediates\classes\debug
然后执行如下javah命令生成h文件。
xxxxx\debug> javah -jni (自己项目的包名.类名=======【NdkJniUtils的包名和类名】)-------在此项目中
执行完之后你可以在文件夹NDKApplication\app\build\intermediates\classes\debug下看见生成的 .h头文件为:
Utils.NdkJniUtils.h-------在此项目中
如图所示:是我自己的Demo---------包含在Terminal中的命令
.h的其内容为:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Utils_NdkJniUtils */
#ifndef _Included_Utils_NdkJniUtils
#define _Included_Utils_NdkJniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Utils_NdkJniUtils
* Method: getCLanguageString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Utils_NdkJniUtils_getCLanguageString
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
4、在工程的main目录下新建一个名字为jni的目录,然后将刚才的 .h文件剪切过来。在jni目录下新建一个c文件,随意取名,我的叫jnitest.c 。然后编辑代码如下(后面会解释啥意思,这里重在工具使用):
//
// Created by Administrator on 2017/1/12.
//
#include "Utils_NdkJniUtils.h"
/*
* Class: Utils_NdkJniUtils
* Method: getCLanguageString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Utils_NdkJniUtils_getCLanguageString
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!");
}
5、接下来在工程的local.properties文件中添加NDK路径(上面下载好的那个NDK),类似其中的SDK路径一样,我的添加后如下:6、接下来在app module目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:
7、现在生成的so库名字也有了,那就去代码的NdkJniUtils Java文件添加静态初始化load代码,添加如下:
static {
System.loadLibrary("Utils_NdkJniUtils"); //defaultConfig.ndk.moduleName
}
好了,到此AS下NDK JNI开发的代码编写和设置就OK了,接下来就是编译工程运行就可以了。
但是有些电脑好奇怪此时编译会报错,妹的,没辙,后来网上找到答案说这是NDK在Windows下一个bug,当只编译一个单一文件时出现,解决办法就是再添加一个空的文件就行了,这个网站有介绍:NDK在Windows的一个bug。不过你要是刚才能顺利编译就没必要蛋疼这个问题了。
好了,我的编译运行结果如下:
对于我自己的项目---还有错误,运行就崩溃,HIA有待研究---不知道是否需要Android.mk