1.从网上获取android-ndk-r20,首先肯定是要有NDK的包,去http://developers.google.cn谷歌的中国官方网站上面去下.然后配置好环境变量
在配置ndk系统环境变量,添加一个变量名“NDK_ROOT”,值为NDK的路径。
在path中新建%NDK_ROOT%
2.在File---Project Structure中配置好ndk的路径
3.在项目名所在的目录下创建一个jni的文件夹,在这个目录里,添加c/c++文件
4.在创建好的jni目录下创建一个Android.mk文件,(就是jni所在路径的makefile)
5.在Android.mk中写如下代码
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
#libtestjni.so //生成so的名字
LOCAL_MODULE := testjni //生成模块的规则,生成的so的名字testjni
LOCAL_SRC_FILES := test.cpp //生成模块的规则,so依赖的cpp文件可以有多个
LOCAL_LDLIBS := -llog //生成模块的规则,当前so依赖的so
include $(BUILD_SHARED_LIBRARY) //生成尾缀是so的文件
6 修改 项目名app/build.gradle
在这个文件中的 android{}作用域中添加如下代码
sourceSets {
main.jniLibs {
//表示生产的so文件所在路径在什么位置
source {
srcDirs = ['../libs']
}
}
}
externalNativeBuild {
ndkBuild {
//表示构件androidJNI的Android.mk的所在路径
path '../jni/Android.mk'
}
}
7.在jni路径下创建一个test.cpp,并随便填充点代码,使用Android studio 中的Terminal命令行进入到jni目录下输入ndk-build.cmd,如果能生产so文件说明cpp编译环境成功。
test.cpp代码
void testJni_Hello()
{
return;
}
8.在目录下面创建一个HelloJNI.java的文件夹,创建相关的函数
使用JNI函数的方式
//调用jni函数的方法
HelloJNI.getInstance().hello_jni();
HlloeJNI.java
package com.ldw.hello;
/**
* author: ldw
* created on: 2019/10/11 3:06
* description:
*/
//专门调用jni C++接口的类
public class HelloJNI {
private static HelloJNI instance = null;
//设置一个单例
public static HelloJNI getInstance() {
if (instance == null) {
instance = new HelloJNI();
}
return instance;
}
//提供一个调用JNI接口的成员方法
public native void hello_jni();
//加载cpp给提供的 动态库
static {
System.loadLibrary("testjni"); //libtestjni.so
}
}
9.在命令窗口下输入命令javah -jni com.ldw.hello.HelloJNI
执行命令以后java目录下生成com_ldw_hello_HelloJNI.h文件
这样java中的方法hello_jni()对应到c语言中的方法是Java_com_ldw_hello_HelloJNI_hello_1jni
com_ldw_hello_HelloJNI.h文件内容如下,这个文件都是函数的声明,需要在实现函数test.cpp中实现
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ldw_hello_HelloJNI */
#ifndef _Included_com_ldw_hello_HelloJNI
#define _Included_com_ldw_hello_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ldw_hello_HelloJNI
* Method: hello_jni
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_ldw_hello_HelloJNI_hello_1jni
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
10.在test.cpp中实现java中hello_jni()的方法