废话不多说
首先新建一个项目
然后新建一个NDK工具类,然后内部声明native方法
之后就build project ,之后会得到中间文件,我们关注的是classes文件夹:
然后我们点出Android Studio 下面的Termina标签输入一下命令,首先进入classes文件夹下的debug文件下,然后输入javah命名
cd app\build\intermediates\classes\debug
之后输入javah命令:
javah -jni com.jst.ndktestdemo.NDKTestUtils
注意的是框里面的是我们新建的NDK工具类包名加类名.
命名运行成功之后在debug文件夹下面会生成一个h文件
内容是这样子:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jst_ndktestdemo_NDKTestUtils */
#ifndef _Included_com_jst_ndktestdemo_NDKTestUtils
#define _Included_com_jst_ndktestdemo_NDKTestUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jst_ndktestdemo_NDKTestUtils
* Method: getNDKString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_jst_ndktestdemo_NDKTestUtils_getNDKString
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
之后我们需要在main目录节点下新建jni文件夹,然后把h文件剪切到jni文件夹中,然后在里面新建一个c文件,名字自取,我这里是Ndktest.c
编辑代码如下:
#include "com_jst_ndktestdemo_NDKTestUtils.h"
JNIEXPORT jstring JNICALL Java_com_jst_ndktestdemo_NDKTestUtils_getNDKString
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"我是C实现的");
}
接下来我们需要在工程的local.properties文件下检查是否配置了NDK路径,没有则要配置上
然后我们要在build.gradle下配置so库文件名,在defaultConfig节点下添加:
defaultConfig {
......
ndk{
moduleName "TestJniLibName" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。
}
}
然后我们需要到NDKTestUtils下添加静态初始化load代码,代码如下:
static {
System.loadLibrary("TestJniLibName"); //defaultConfig.ndk节点下配置的so库名
}
最后记得在gradle.properties下添加android.useDeprecatedNdk=true
最后,我们代码实现调用,
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);
final NDKTestUtils ndkTestUtils = new NDKTestUtils();
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,ndkTestUtils.getNDKString(),Toast.LENGTH_SHORT).show();
}
});
}
}
效果如下: