1.为什么使用NDK
1.代码保护:由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2.效率高:大部分现存的开源库都是用C/C++代码编写的。
3.便于移植:用C/C++写得库可以方便在其他的嵌入式平台上再次使用。
2.配置环境
工具:android studio
使用android studio开发JIN特别简单,只要把红色区域勾选上就可以了。
![](https://img.haomeiwen.com/i3247521/8a3e789f6eef98e6.png)
2.创建NDK项目
第一步
点击File-->New-->New Project,出现下图;
![](https://img.haomeiwen.com/i3247521/79c7ccef3c389c8e.png)
⚠️一定要勾选Include C++ support
第二步
点击next,选择版本,
继续next,添加Activity类型,
继续next,创建Activity以及布局文件,
最后,到如下页面:
![](https://img.haomeiwen.com/i3247521/54bc8ab8da17235f.png)
C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。
Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。
⚠️课根据自己的需求,进行自定义配置。
点击Finish,项目创建完成。、
第四步
等待项目编译完成之后,直接运行Run ’app‘,你就看见Hello World啦,如图;
![](https://img.haomeiwen.com/i3247521/9f23de70afb65fe4.png)
2.代码分析
是不是很疑惑,一句代码都没有写,就完成了第一个NDK项目?😊那是我们的AS越来越强大了,只要添加了Include C++ support,AS会自动帮我们实现Hello World,是不是很给力呢😊。
现在,我们分析分析,用代码是怎么实现的吧。
- HelloActivity
package com.android.ndkstudy.ui;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.android.ndkstudy.R;
public class HelloActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
// 1.导入NDK jar包,即平时使用的so文件
// 使用静态方法,保证在使用时前,架包已导入。
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello);
// Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());//3 直接使用native方法
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
* 2 直接使用so库中的方法,使用 native 关键字,即so的方法
*/
public native String stringFromJNI();、
}
- native-lib.cpp
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring
JNICALL
Java_com_android_ndkstudy_ui_HelloActivity_stringFromJNI(//方法名,即包的路径,加上_方法名
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";//对字符串赋值
return env->NewStringUTF(hello.c_str());//返回数据
}
参数简介:
- JNIEnv :局部数据的指针,用于传递数据;
-
jobject:类引用,即当前对象
备注:⚠️NDK开发中,包的路径是绝对路径,不应该随便更改,若更改java中的包路径,NDK中的路径也要随之更改。
网友评论