NDK 是什么?
NDK是一系列工具的集合,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk
为什么使用NDK
- 代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
- 提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
- 便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。
开始使用
下载ndk环境的这里不赘述了
添加jni文件夹
在app下的build.gradle加入ndk的配置
写调用代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.tv_hello);
textView.setText(strFromC());
}
//声明一个native方法
public native String strFromC();
//静态代码块里加载native方法的so库,名字和之前定义的一样
//ps:静态代码块里面的代码在类初始化时会最新被加载
static {
System.loadLibrary("hello_c");
}
}
生成.h头文件
到调用类那个文件夹下执行javah命令
javah的更多用法
在同级目录下会生成报名+类名的头文件,之后将其拖拽到jni文件下,并创建一个c文件
com_simplepeng_jnidemo_MainActivity.h
没有c基础的可以暂时不了解其中的用法和含义
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_simplepeng_jnidemo_MainActivity */
#ifndef _Included_com_simplepeng_jnidemo_MainActivity
#define _Included_com_simplepeng_jnidemo_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_simplepeng_jnidemo_MainActivity
* Method: strFromC
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_simplepeng_jnidemo_MainActivity_strFromC
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
hello_c.c
没有c基础的可以暂时不了解其中的用法和含义
//包含生成的.h头文件
#include "com_simplepeng_jnidemo_MainActivity.h"
//*env 指向 JNINativeInterface 结构的指针
//obj 指向void*
//所有的都可以在jni.h中找到
JNIEXPORT jstring JNICALL Java_com_simplepeng_jnidemo_MainActivity_strFromC
(JNIEnv *env, jobject obj) {
const char *str = "hello from c";
return (*env)->NewStringUTF(env, str);
}
编译项目,生成so库
正确生成so库后就可以运行项目查看native方法是否调用成功
可以看到是成功调用到了native的方法的。
其他注意事项
在builde.gradle中配置了ndk自己就生成了Android.mk
如果报没找到ndk相关配置错误,可能就需要自己在local.properties中配置ndk的目录
ndk.dir=/Users/simple/Library/Android/sdk/ndk-bundle
或者报ndk版本问题,可能也需要在gradle.properties中配置
android.useDeprecatedNdk=true