NDK开发之入门了解
- NDK
Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。众所周知,Android程序是运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。
NDK包括了:
从C / C++生成原生代码库所需要的工具和build files。
将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。
支持所有未来Android平台的一系列原生系统头文件和库
- JNI
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。
- NDK和JNI的关系
通俗点说NDK其实一个环境,可以为我们生成了C/C++的动态链接库。JNI是java和C/C++沟通的接口,为我们规定了一套标准(其实DNK也是基于JNI这个编码规范开发的) 。而Android程序是用java语言开发,然后通过JNI我们可以和C/C++进行交互。这样我们就可以用DNK和JNI来完成java+C/C++的方式。
- 为何要用到NDK?
概括来说主要分为以下几种情况:
- 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库被反编译的难度较大。
- 在NDK中调用第三方C/C++库,因为大部分优秀的开源库都是用C/C++代码编写的。
- 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。
- 硬件和性能方面。java是不能直接访问手机的硬件的,而C/C++的可以直接访问。
-
环境搭建
打开System Setting>Android SDK,选择SDK Tools。然后勾选下图红色箭头指向的CMake LLDB NDK并下载安装,这样你的环境就搭建好了。 ABF646C6-79F2-49C7-BE37-C219BF84FDE1.png
在安装好androidstudio前提下,我们只需要安装 NDK开发插件。
-
创建一个NDK项目
创建项目和平常一样只是要把C++支持(invlude C++ suppoer)勾选,
6534BF73-0D5D-4CEF-8B79-66077A6CCAE4.png
- Exceotions Support(支持异常处理)
- Runtime Type information(支持运行时类型信息)
创建完以后,我们会发现多了一个cpp的文件
4F1BE064-6238-4105-8AE7-06E91FC051BC.png
public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
//加载so库或jni库,在使用到该库之前加载就行
static {
System.loadLibrary("native-lib");
}
int a = 10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*将用C++代码实现,在android代码中调用的方法
*/
public native String stringFromJNI();
在我们的native-lib.cpp文件中有个...stringFromJni方法中返回的了一段jstring:Hello from C++。
extern "C":允许在编译的时候成C文件,向下兼容。(本身是 C++)
JNIEXPORT:作用是允许该方法被java调用。
JNICALL:约束函数如栈顺序,和堆栈内存清理的规则
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
Java_com_captain_wudongsheng_day3ndk_MainActivity_stringFromJNI(
JNIEnv *env,
jobject jobject1/* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
943F5594-8DAB-4D10-A30C-F2EA09AB1184.png
运行完项目你会发现textView设置的内容为Hello from C++,说明我们调用成功了。