开发工具:Android Studio
一:新建一个调用C本地方法的配置类
package ndk.example.com;
public class JNITools {
public native int addNum(int num1, int num2);
}
二:用Javah 命令生成java文件对应的.h文件
- 打开terminal,cd 到项目的根目录------>cd app/src/main/java
- 输入javah ndk.example.com.JNITools命令 //这个位置是类的包名+类名
- ndk_example_com_JNITools.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ndk_example_com_JNITools */
#ifndef _Included_ndk_example_com_JNITools
#define _Included_ndk_example_com_JNITools
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: ndk_example_com_JNITools
* Method: addNum
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_ndk_example_com_JNITools_addNum
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
三:在项目的main目录下创建一个jni文件目录,将ndk_example_com_JNITools.h文件剪贴到jni目录下,并在jni目录下创建MyJni.c文件,将.h文件中的方法拷贝到MyJni.c中,并增加方法实现(此处都是用C编写代码)。如下图:
#include "jni.h"
#include "ndk_example_com_JNITools.h"
JNIEXPORT jint JNICALL Java_ndk_example_com_JNITools_addNum(
JNIEnv *env, jobject obj, jint num1, jint num2) {
return num1 + num2;
}
在jni目录创建Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := create #对应生成libcreate.so库
LOCAL_SRC_FILES := MyJni.c #MyJni.c源文件的名字
include $(BUILD_SHARED_LIBRARY) #构建动态链接库
在jni目录创建Application.mk文件
APP_ABI := all
四:生成so文件
- cd到jni 目录
- 运行ndk-build命令生成 so文件,我这里用的自己下载的ndk
官方地址:https://developer.android.google.cn/ndk/downloads/older_releases.html
//执行这个命令必须在jni目录下
//这个位置是你下载的ndk 然后运行 就可以编译成功so了 分别在main/libs和main/obj
C:/android-ndk-r21-windows-x86_64/android-ndk-r21/ndk-build
五:引用so文件
//项目的类型 是app还是lib
apply plugin: 'com.android.application'
//关于项目的配置
android {
//
compileSdkVersion 27
//
defaultConfig {
applicationId "ndk.example.com"
minSdkVersion 20
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
multiDexEnabled true
}
//
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//引用so库文件.多个的话以逗号分隔
sourceSets {
main() {
jniLibs.srcDirs = ['libs']
jni.srcDirs = []
}
}
}
//项目的依赖
dependencies {
}
六:创建MainActivity,调用JNITools类中的本地方法,注意先加载动态链接库
static {
//加载so库
System.loadLibrary("create");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hx);
new JNITools().addNum(20, 100);
}