1.NDK简介
定义:Native Development Kit,是 Android的一个工具开发包 由C/C++语言实现
作用:快速开发C/C的动态库,并自动将so和应用一起打包成 APK 即可通过 NDK在Android中使用JNI与本地代码(如C、C)交互
应用场景:在Android的场景下 使用JNI即 Android开发的功能需要本地代码(C/C++)实现
特点:将主要的功能用C/C语言编写并打包成so 动态库不容易被反编译具有较高的安全性 使用C/C编写的代码运行效率更高并且可以移植到其他平台使用
下载安装NDK
环境变量的配置这里就不赘述了
这里讲述的是在Android Studio 下NDK开发
创建项目时添加C的支持 选择默认的C版本 和 添加C++的异常处理
创建完项目之后可以在app Module的目录下看到CMakelist.txt文件以及CPP文件目录(存放编写c文件和c++文件和头文件) 这时就可以根据自己的需求编写CMakelist.txt文件
1.设置so文件的输出路径 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
2.编写Java本地方法
public static native String getStringFromC();
3.使用javah 命令生成.h 文件 因为前面已经定义了so的输出路径 所以也可以在 Android Studio 中自定义external tool 这里发个自定义External Tools 的文章
执行完命令后就可以在自定义的.h文件输出目录下找 .h头文件
4.创建要调用的C文件
NDK_Practice.c
5.编写完c文件后 再进入CMakelist.txt 文件中进行配置 加入自己编写的c文件 和 log lib 包引用
add_library( # Sets the name of the library. NDK_Practice # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/NDK_Practice.c )
6.make project
8.编写JNI 实现Java 调用 C
#include "com_james_ndk_practice_NDKPracticeActivity.h"
JNIEXPORT jstring JNICALL Java_com_james_ndk_1practice_NDKPracticeActivity_getStringFromC
(JNIEnv *env,jclass jcls){
char *c ="ndk practice";
return (*env)->NewStringUTF(env,c);
}
在Activity 加载so文件并调用C
static {
System.loadLibrary("NDK_Practice");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ndk_practice);
Toast.makeText(this,getStringFromC(), Toast.LENGTH_SHORT).show();
}
public static native String getStringFromC();
最后附上Github 的demo地址NDK_Practice
网友评论