一些要求高性能 高安全类项目都会使用C、C++动态库,而NDK可以帮助我们快速开发集成,音视频转解码压缩等、直播、智能硬件、自己及公司封装的SDK等方面都有用到NDK
一、NDK下载及环境集成
1.File->setting->...Android SDK进入该界面勾选CMake、LLDB、NDK三个工具并Apply等待安装...
2.配置NDK路径
将安装的NDK路径填入图二红色标记中
3.配置环境变量
控制面板->....环境变量下
新建系统变量NDK_ROOT 值为NDK安装路径
新建系统变量Path 值为;%NDK_ROOT%;
cmd命令ndk-build验证是否安装成功
二、测试Demo
1、创建一个JNITest类如下图
2、生成该类的头文.h
快捷键alt+fn+f12或者alt+f12
命令模式进入项目app/src/java目录如下图
javah -d ../jni com.study.ndkdemo.JNITest 这句命令行的意思在项目中新建jni目录并生成.h文件成功后项目目录会多com_study_ndkdemo_JNITest.h文件
3.在jni录下创建一个test.c、Android.mk、Application.mk文件
test.c
#include "com_study_ndkdemo_JNITest.h"
JNIEXPORT jstring JNICALL Java_com_study_ndkdemo_JNITest_get
(JNIEnv *env, jclass jclass){
return (*env)->NewStringUTF(env,"Faye Wong NDK TEST");
}
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNITest
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)
Application.mk APP_ABI := all
4.命令行生成so库
三.验证测试
1.在build.gradle文件夹下加
sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程 }
}
2.在JNITest类中动态导入so库
package com.study.ndkdemo;
public class JNITest {
static {
System.loadLibrary("JNITest");
}
public JNITest(){
}
public native static String get();
}
3.最后在MainActivity中输出显示
public class MainActivityextends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String value=JNITest.get();
Toast.makeText(this,"返回值为->"+value,Toast.LENGTH_SHORT).show();
}
}
GitHub下载地址:演示Demo