一,开发环境
win10 AndroidStudio 3.1.2 NDK版本:R16
二,配置NDK环境变量:
和配置Java JDK环境变量相同,不会的可以自行百度配置NDK环境变量,很多种;
三,在自己项目创建本地方法:
四,手动创建本地方法fromJNIString()对应的.h头文件
1,在电脑的cmd 或者AndroidStudio的Terminal中输入javah -d D:\Demo\NDKDemo\app\src\main\jni -classpath D:\Demo\NDKDemo\app\src\main\java com.ang.ndkdemo.MainActivity
1)D:\Demo\NDKDemo是我的项目路径 \app\src\main\jni 要创建的.h头文件的输出路径
2)-d D:\Demo\NDKDemo\app\src\main\jni 创建jni文件夹并指定.h输出目录
3)D:\Demo\NDKDemo\app\src\main\java com.ang.ndkdemo.MainActivity 包含本地方法(fromJNIString())的类的绝对路 径,com.ang.ndkdemo.MainActivity 注意是包名+类名,不要写成了D:\Demo\NDKDemo\app\src\main\java\com\ang\ndkdemo\MainActivity;
2,执行以上命令之后:就在项目的main文件夹下创建了jni文件夹,并且在jni文件夹下自动创建了.h头文件;
3,生成.h头文件时候,如果出现“找不到类文件”的错误请参考 https://blog.csdn.net/ezconn/article/details/82352531这篇文章
五,在jni目录下创建c或者c++文件,名字随意
C++代码(注意C和C++代码是由区别的这个):
1)Hello.c文件。在C中没有引用,传递的env是个两级指针,用(*env)->调用方法且方法中要传入env.
#include <jni.h>
#include "com_ang_ndkdemo_MainActivity.h"
JNIEXPORT jstring JNICALL
Java_com_ang_ndkdemo_MainActivity_fromJNIString(JNIEnv* env, jobject obj) {
return (*env)->NewStringUTF(env,"I am From Native C");
}
2) Hello.cpp文件。C++中env为一级指针,用env->调用方法,无需传入env;C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern "C"进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名;exter "C"{jni代码}。
#include <com_ang_ndkdemo_MainActivity.h>
#include <stdio.h>
JNIEXPORT jstring JNICALL
Java_com_ang_ndkdemo_MainActivity_fromJNIString(JNIEnv *env, jobject obj)
{
return env->NewStringUTF("I am From Native C");
}
六,配置build.gradle(Model:App)
defaultConfig {
applicationId "com.ang.demo"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//ndk编译生成.so文件
ndk{
moduleName "Java2c" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。
}
}
七,编写Android.mk文件(自行百度吧,我也不太会) 如下是我的自动生成方式:
1)紧接着步骤六之后,点击Androidstudio 菜单栏 Build ->ReBuildProject
报错:
2)在app ——> build ——>intermediater——>ndk(自动创建)目录下自动创建了一个Android.mk文件
八,Android.mk文件复制到jni目录下; 鼠标右键,点击Link C++ .....修改Androidstudio默认编译工具,在BuildSystem栏选择ndk-build,在ProjectPath栏 找到刚才复制的Android.mk文件,点击OK之后就在build.gradle(Model:App)的android{}中自动生成了externalNativeBuild { ndkBuild { path 'src/main/jni/Android.mk' } }
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
九,最后在MainActivity中加载我们生成的动态库: